constexpr int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }

上面的代码段:
  • 在带有g++ 7-Wall -Wextra -Wpedantic上编译时不发出警告。
  • 在带有clang++ 4-Wall -Wextra -Wpedantic上编译时不发出警告。
  • 无法在MSVC 2017上编译:


  • 问:这里的MSVC错误吗?

    live example on godbolt.org
    int i = 100;
    struct F { F(unsigned int){} };
    int main() { F{i}; }
    
  • 在带有g++ 7-Wall -Wextra -Wpedantic上使用警告编译:

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

  • 无法在MSVC 2017上编译:


  • 问:在这里g++错误吗? (即是否会产生硬错误?)

    live example on godbolt.org

    最佳答案

    从来没有要求任何C++程序都会产生硬错误。有打印诊断的要求。诊断的形式未由标准指定:一个古老的 Jest 是,打印单个空格可满足标准的诊断要求。那将是实现质量的问题。

    有格式错误的程序,标准对其行为没有限制,有时甚至是强制性的诊断。

    在某些情况下,程序格式错误,需要进行诊断。处理该问题的一种方法是生成一条消息,指出它是错误,然后不生成任何二进制文件来运行。另一种方法是生成一条消息,说它是警告,然后生成可以运行的二进制文件。

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

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

    Shafik's answer here涵盖了第一个问题。 i是常量表达式,其值适合目标类型;缩小转换不应有警告或错误。

    C++标准不能抵御恶意编译器。

    据说,可以将-pedantic-errors传递给g++,以使其在标准要求生成的程序格式错误时生成硬错误而不是警告。

    09-07 10:16