我似乎找到了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的错误,但我不确定。如果这是任何一个编译器的错误,是否已经报告过?
答案 0 :(得分:42)
Clang正在根据以下段落进行诊断
[stmt.if] (强调我的意思)
2如果if语句的形式为if constexpr,则 条件应为的上下文转换常量表达式 输入bool ;这种形式称为constexpr if语句。
[expr.const]
4类型T的转换常量表达式是一个表达式, 隐式转换为T类型,其中转换后的表达式为 常量表达式,并且隐式转换序列仅包含
- 积分转化,而不是缩小转化率,
现在,当涉及整数转换时,是到 bool
is listed as an integral conversion的转换。从严格意义上讲,它正在缩小,因为布尔值不能代表int
的所有值。因此,诊断并非没有根据。
但是,我认为考虑转换为bool
通常是为了检查“真实性”这一事实也是很合理的,因此其狭窄的性质并不重要。它看起来像是标准 1 中的一个小错误,GCC采取了常识性路线,而Clang在最严格的意义上坚持了法律的枯燥乏味。
答案 1 :(得分:12)
我们这么说,但是它是隐藏的。 “ bool
类型的经上下文转换的常量表达式”是一种标准的技术术语,不包括缩小转换。
C语是正确的。