为什么编译“ if constexpr”的假分支?

问题描述

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

PS 。缺少的“;”只是为了检查else是否正在编译。

解决方法

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

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

第二,即使在模板中,对于所有可能的实例化,if constexpr的废弃分支也不会格式错误。在您的代码中情况并非如此,因为:

int b = 10

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

因此,编译器在给出编译错误时是正确的。从技术上讲,如果所有实例的废弃分支格式都不正确,则不需要要求给出编译器错误,但是代码仍然是错误的。