Constexpr如果是非bool条件

问题描述 投票:40回答:2

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

c++ language-lawyer c++17 implicit-conversion compiler-bug
2个回答
43
投票

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严格遵守法律的干法。


1 - 和a proposal exists to change it


12
投票

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

铿锵是对的。

© www.soinside.com 2019 - 2024. All rights reserved.