繁体   English   中英

缩小从`int`(常量表达式)到`unsigned int`的转换 - MSVC vs gcc vs clang

[英]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 -Wpedanticg++ 7上编译没有警告

  • 使用-Wall -Wextra -Wpedanticclang++ 4上编译时没有警告

  • 无法在MSVC 2017MSVC 2017上编译:

    从'const int'转换为'unsigned int'需要缩小转换

问:这是MSVC错了吗?

godbolt.org上的实例


int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
  • 使用-Wall -Wextra -Wpedanticg++ 7上编译警告

    缩小'i'从'int'到'unsigned int'的转换

  • 无法用-Wall -Wextra -Wpedantic编译clang++ 4

    在初始化列表中,非常量表达式不能从类型'int'缩小到'unsigned int'

  • 无法在MSVC 2017MSVC 2017上编译:

    从'const int'转换为'unsigned int'需要缩小转换

问:这里的g ++错了吗? (即它应该产生硬错误吗?)

godbolt.org上的实例

永远不要求任何C ++程序产生硬错误。 有打印诊断的要求。 诊断的形式没有通过标准规定:一个古老的笑话是打印出单个空间满足标准的诊断要求。 这将是一个实施质量问题。

有一些格式不正确的程序,标准对其行为没有任何限制,有时也是强制性诊断。

有些情况下程序格式不正确并且需要诊断。 处理它的一种方法是产生一条消息,说明它是一个错误,然后不生成任何二进制文件来运行。 另一种方法是生成一条消息,说明它是一个警告,然后生成一个可以运行的二进制文件。

因此,g ++在标准下仅仅打印出警告并没有错。

由此产生的程序在技术上是所有未定义的行为; g ++可以在运行时格式化您的硬盘而不违反标准。 这将被视为执行质量问题。

Shafik的答案涵盖了第一个问题。 i是常量表达式,其值适合目标类型; 关于缩小转换应该没有警告或错误。

C ++标准并不能保护您免受恶意编译器的攻击。

据报道,当标准规定生成的程序不正确时,可以将-pedantic-errors传递给g ++以使其生成硬错误而不是警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM