【问题标题】:Why does the false branch of "if constexpr" get compiled?为什么“if constexpr”的错误分支会被编译?
【发布时间】:2020-08-18 13:08:04
【问题描述】:

为什么这段代码在编译时会出错?我对“if constexpr”的了解(以及this)表明不应编译else 块。

if constexpr (true) {
    int a = 10;
} else {
    int b = 10
}

错误是:

error: expected ‘,’ or ‘;’ before ‘}’ token

使用的编译器:g++ 版本 7.5.0
编译时我使用了 -std=c++17 标志。

P.S. 缺少的 ';'是故意的,只是为了检查else是否正在编译。

【问题讨论】:

  • 也许您应该明确指出缺少的; 是有目的的;至少这似乎是你对我的意图(我想测试 else 块是否正在编译)。
  • “不编译”(或实例化)和“不解析”之间存在天壤之别。
  • 这是一个完全合理的问题,代码sn-p的意图很明确。

标签: c++ c++17 constexpr if-constexpr


【解决方案1】:

这里有 2 个独立但相关的问题。

首先,if constexpr 只会有条件地编译模板中的分支。在模板之外,所有的分支都将被编译并且必须是良好的格式。

其次,即使在模板中,if constexpr 的废弃分支也不能针对所有可能的实例化格式错误。您的代码中不是这种情况,因为:

int b = 10

总是格式不正确(由于缺少;)。

所以编译器给出编译错误是正确的。从技术上讲,如果丢弃的分支对于所有实例都是非良构的,则编译器不需要给出编译器错误,但代码仍然是错误的。

【讨论】:

  • 感谢您的快速回答。你能解释一下“在模板内”吗?
  • 另外,第二种情况是NDR。
  • @KishanShukla if constexpr 的行为有点像模板。错误分支仍然被编译,但并不总是被实例化。如果没有依赖类型,则检查所有分支的有效性。这不像预处理器。
  • @T.C.:真的吗?它甚至不解析,所以我不确定我们是否达到了“检查”可能的实例化的分析水平。
  • @DavisHerring [temp.res]/8 有一个同样不解析的例子。 /耸肩
猜你喜欢
  • 2014-08-02
  • 2014-09-23
  • 2014-06-08
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多