【发布时间】:2017-08-21 21:55:48
【问题描述】:
constexpr int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
上面的sn-p:
在
g++ 7和-Wall -Wextra -Wpedantic上编译没有警告。在
clang++ 4和-Wall -Wextra -Wpedantic上编译没有警告。-
在
MSVC 2017上编译失败:从“const int”到“unsigned int”的转换需要缩小转换
问:这里是 MSVC 错了吗?
int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
-
在
g++ 7和-Wall -Wextra -Wpedantic上编译带有警告:将“i”从“int”缩小到“unsigned int”
-
无法用
-Wall -Wextra -Wpedantic编译clang++ 4:在初始化列表中,非常量表达式不能从“int”类型缩小到“unsigned int”
-
在
MSVC 2017上编译失败:从 'const int' 到 'unsigned int' 的转换需要缩小转换
问:这里g++错了吗? (即它应该产生一个硬错误吗?)
【问题讨论】:
-
大多数时候标准只是说“诊断”,它涵盖了警告和错误。
-
@ShafikYaghmour:我明白了,谢谢。我假设 MSVC 在第一个 sn-p 中是错误的呢?根据 Richard 的说法,我认为 g++ 和 clang++ 在 sn-ps 中都是兼容的。
-
使用 GCC,要将标准强制诊断转换为错误,但仅限标准强制诊断,请使用
-pedantic-errors,尽管如上所述的警告足以满足标准要求。
标签: c++ c++11 visual-c++ type-conversion language-lawyer