为什么 "if constexpr" 的 false 分支会被编译?

Why does the false branch of "if constexpr" get compiled?

为什么这段代码在编译时出错?我对“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 标志。

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

此处有 2 个独立但相关的问题。

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

其次,即使在模板中,if constexpr 的丢弃分支也不可能对所有可能的实例化都是 ill-formed。在您的代码中情况并非如此,因为:

int b = 10

总是ill-formed(由于缺少;)。

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