为什么 "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,那么编译器不需要给出编译错误,但代码仍然是错误的。
为什么这段代码在编译时出错?我对“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,那么编译器不需要给出编译错误,但代码仍然是错误的。