Constexpr如果是非bool条件

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 - 存在改变它的提议.

  • 标准中的错误!大声笑 (11认同)
  • @Rakete1111 - 无耻地加入了答案:)谢谢! (3认同)

T.C*_*.C. 12

我们这么说,但它是隐藏的."上下文转换的常量表达式bool"是一种标准术语,不包括缩小转换.

铿锵是对的.