[英]Narrowing conversion from `int` (constant expression) to `unsigned int` - MSVC vs gcc vs clang
constexpr int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
上面的代码:
使用-Wall -Wextra -Wpedantic
在g++ 7
上编译没有警告 。
使用-Wall -Wextra -Wpedantic
在clang++ 4
上编译时没有警告 。
无法在MSVC 2017
年MSVC 2017
上编译:
从'const int'转换为'unsigned int'需要缩小转换
问:这是MSVC错了吗?
int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
使用-Wall -Wextra -Wpedantic
在g++ 7
上编译警告 :
缩小'i'从'int'到'unsigned int'的转换
无法用-Wall -Wextra -Wpedantic
编译clang++ 4
:
在初始化列表中,非常量表达式不能从类型'int'缩小到'unsigned int'
无法在MSVC 2017
年MSVC 2017
上编译:
从'const int'转换为'unsigned int'需要缩小转换
问:这里的g ++错了吗? (即它应该产生硬错误吗?)
永远不要求任何C ++程序产生硬错误。 有打印诊断的要求。 诊断的形式没有通过标准规定:一个古老的笑话是打印出单个空间满足标准的诊断要求。 这将是一个实施质量问题。
有一些格式不正确的程序,标准对其行为没有任何限制,有时也是强制性诊断。
有些情况下程序格式不正确并且需要诊断。 处理它的一种方法是产生一条消息,说明它是一个错误,然后不生成任何二进制文件来运行。 另一种方法是生成一条消息,说明它是一个警告,然后生成一个可以运行的二进制文件。
因此,g ++在标准下仅仅打印出警告并没有错。
由此产生的程序在技术上是所有未定义的行为; g ++可以在运行时格式化您的硬盘而不违反标准。 这将被视为执行质量问题。
Shafik的答案涵盖了第一个问题。 i
是常量表达式,其值适合目标类型; 关于缩小转换应该没有警告或错误。
C ++标准并不能保护您免受恶意编译器的攻击。
据报道,当标准规定生成的程序不正确时,可以将-pedantic-errors
传递给g ++以使其生成硬错误而不是警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.