我似乎找到了Clang和GCC不同意的东西。这是代码:
int main() {
if constexpr (2) {}
}
这成功编译了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.
cppreference似乎没有提到“缩小”,所以这看起来像一个Clang bug,但我不完全确定。如果这是任何一个编译器的错误,是否已报告?
Clang根据这些段落进行诊断
[stmt.if](强调我的)
2如果if语句的格式为constexpr,则条件的值应为bool类型的上下文转换常量表达式;此表单称为constexpr if语句。
[Expr.const]
4 T类型的转换常量表达式是一个表达式,隐式转换为T类型,其中转换后的表达式是常量表达式,隐式转换序列仅包含
- 除了缩小转化次数之外的积分转换,
现在,当谈到积分转换时,转换为bool
is listed as an integral conversion。从最严格意义上来说,它正在缩小,因为布尔不能代表int
的所有价值。所以诊断并非毫无根据。
但我认为考虑转换为bool
通常是为了检查“真实性”这一事实也是合理的,因此它的缩小性质无关紧要。它看起来像标准1中的一个小错误,GCC采用常识路线,而Clang严格遵守法律的干法。
我们这么说,但它是隐藏的。 “bool
类型的上下文转换常量表达式”是一种标准术语,不包括缩小转换。
铿锵是对的。