【发布时间】:2014-08-27 19:06:08
【问题描述】:
// g++ sizeofint.cpp --std=c++11 -Wconversion -Wall -Wextra -Werror -pedantic-errors
#include <iostream>
#include <utility>
int main(int argc, char **argv) {
(void)argc;
(void)argv;
int a = 0x12345678;
std::cout << sizeof(int) << "..." << sizeof(uint16_t) << std::endl;
std::pair<uint16_t, uint16_t> p{a,a}; // !!!! no warning or error on conversion !!!!
std::cout << p.first << ":" << p.second << std::endl;
uint16_t b = a; // !!!! correct behavior: -Wconversion triggers warning, which -Werror turns to an error
std::cout << b << std::endl;
return 0;
}
通过上面的代码,你可以清楚地看到在构造p时从int到uint16_t的隐式转换。但是,从 4.9.1 版本开始的 g++ 在使用开头注释中提供的参数时不会抱怨任何转换。
后来,g++ 确实抱怨在构造 b 时隐式转换为 uint16_t。
我正在努力确保p 的构造至少会导致警告(但最好是错误)。
有什么想法吗?是否有一个我不知道的标志会触发正确的行为?
【问题讨论】:
-
你点击了
std::pair的template<class U, class V> constexpr pair(U&& x, V&& y);构造函数。由于转换实际上发生在该构造函数内部(在系统标头中),因此您不会收到警告。 -
如果建筑在图书馆内,我可以理解。但正如你所说,这是在一个模板中......它被编译,因此应该检查。
-
@T.C.应该是答案吗?
-
gcc docs :“在 GCC 处理系统标头时,所有警告,除了由‘#warning’(参见诊断)生成的警告之外,都会被抑制。”见your modified example gives you the expected warning
-
@millsj,谢谢你的工作。当然,现在也有很多其他的废话……只是强调了有多少幕后的魔法被黑在一起。 :(
标签: c++ casting g++ type-conversion