// 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;
}
通过上面的代码,您可以清楚地看到从int
to uint16_t
构建时p
。然而,从版本 4.9.1 开始,g++ 在使用开头注释中提供的参数时不会抱怨任何转换。
后来,g++ 确实抱怨构造时隐式转换为 uint16_tb
.
我正在努力确保p
的构造至少会导致警告(但最好是错误)。
有什么想法吗?是否有一个我不知道的标志可以触发正确的行为?
如果您的代码使用了constexpr pair(const uint16_t& x, const uint16_t& y);
的构造函数std::pair<uint16_t, uint16_t>
,您会收到警告和/或错误。你甚至不需要-Wconversion
为此 - 缩小大括号内的转换会导致程序格式错误。
但相反,选择了重载分辨率std::pair
's template<class U, class V> constexpr pair(U&& x, V&& y);
构造函数,这是一个更好的匹配。结果,转换不是在您编写的代码内发生,而是在该构造函数内发生。由于该构造函数是在系统标头中定义的(请参阅GCC 的文档,帽子提示@quantdev),该警告被 GCC 抑制。
虽然你可以使用-Wsystem-headers
要启用来自系统标头的警告,该选项将产生许多不相关的警告所以与人的互动非常糟糕-Werror
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)