如果是非布尔条件,则为Constexpr

时间:2019-02-27 06:39:17

标签: c++ language-lawyer c++17 implicit-conversion compiler-bug

我似乎找到了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的错误,但我不确定。如果这是任何一个编译器的错误,是否已经报告过?

2 个答案:

答案 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 -还有a proposal exists to change it

答案 1 :(得分:12)

我们这么说,但是它是隐藏的。 “ bool类型的经上下文转换的常量表达式”是一种标准的技术术语,不包括缩小转换。

C语是正确的。