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++,以使其在标准要求生成的程序格式错误时生成硬错误而不是警告。