【问题标题】:Constexpr if with a non-bool conditionConsexpr if 具有非布尔条件
【发布时间】:2023-04-01 10:31:02
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

Clang 正在根据这些段落进行诊断

[stmt.if](强调我的)

2 如果 if 语句的形式为 if constexpr,的值 条件应是上下文转换的常量表达式 输入布尔;这种形式称为 constexpr if 语句。

[expr.const]

4 T 类型的转换常量表达式是一个表达式, 隐式转换为类型 T,其中转换后的表达式是 常量表达式和隐式转换序列只包含

  • 除缩小转化之外的整体转化,

现在,当涉及到积分转换时,转换 bool is listed as an integral conversion。从最严格的意义上讲,它正在缩小,因为 bool 不能代表 int 的所有值。所以诊断并非没有根据。

但我认为考虑转换为bool 通常是为了检查“真实性”这一事实也是相当合理的,因此它的缩小性质应该无关紧要。它看起来像是标准1 中的一个小错误,GCC 走的是常识路线,而 Clang 遵守最严格意义上的法律条文。


1 - 还有a proposal exists to change it

【讨论】:

  • 标准中的一个错误!哈哈
  • @Rakete1111 - 无耻地添加到答案中:) 谢谢!
【解决方案2】:

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

Clang 是正确的。

【讨论】:

  • CWG 是否同意标准中的当前措辞是有意的?
猜你喜欢
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多