Ker*_*g73 41 c++ language-lawyer compiler-bug implicit-conversion c++17
我似乎找到了Clang和GCC不同意的东西.这是代码:
int main() {
if constexpr (2) {}
}
Run Code Online (Sandbox Code Playgroud)
这成功编译了GCC 7.4.0,但它与Clang 7.0.0失败并出现此错误消息:
test.cpp:3:17: error: constexpr if condition evaluates to 2, which cannot be narrowed to type 'bool'
[-Wc++11-narrowing]
if constexpr (2) {}
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
cppreference似乎没有提到"缩小",所以这看起来像一个Clang bug,但我不完全确定.如果这是任何一个编译器的错误,是否已报告?
Sto*_*ica 43
Clang根据这些段落进行诊断
[stmt.if](强调我的)
2如果if语句的格式为constexpr,则条件的值应为bool类型的上下文转换常量表达式 ; 此表单称为constexpr if语句.
[expr.const]
4 T类型的转换常量表达式是一个表达式,隐式转换为T类型,其中转换后的表达式是常量表达式,隐式转换序列仅包含
- 除了缩小转化次数之外的整数转换,
现在,当涉及到整体转换,转换到 bool 被列为整体转换.从最严格的意义上说,它正在缩小,因为布尔不能代表一个人的所有价值观int.所以诊断并非毫无根据.
但我认为将转换bool通常用于检查"真实性" 这一事实也是合理的,因此它的缩小性质无关紧要.它看起来像标准1中的一个小错误,GCC采用常识路线,而Clang严格遵守法律的干法.
1 - 存在改变它的提议.