1

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

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

错误是:

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

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

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

4

1 回答 1

9

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

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

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

int b = 10

总是格式错误的(由于缺少;)。

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

于 2020-08-18T13:13:28.727 回答