为什么即使在使用 constexr if 时也会“使用未声明的标识符”?

Use*_*645 0 c++ if-statement undeclared-identifier constexpr

玩代码。

template<typename T>
T f() {
    if constexpr (std::is_same<T, int>::value) {
        T t = 10;
    }else {
        T t;
    }
    return t;
}
Run Code Online (Sandbox Code Playgroud)

我对上述代码的理解f

int t = 10; 
return t;
Run Code Online (Sandbox Code Playgroud)

或者

T t = // some default value for T 
return t;
Run Code Online (Sandbox Code Playgroud)

取决于T. 在两者中都会有一个名为 的标识符t。为什么编译器仍然抱怨use of undeclared identifier 't'?。

编译器在解析constexpr语句之前是否检查未声明的标识符?

dfr*_*fri 5

我对上面代码的理解是 f 的主体要么是

int t = 10; 
return t;
Run Code Online (Sandbox Code Playgroud)

或者

T t = // some default value for T 
return t;
Run Code Online (Sandbox Code Playgroud)

不。一个更有效的比较是,对于true分支来说,它要么是:

{
    int t = 10;
} // end of scope for 't'
return t;  // 
Run Code Online (Sandbox Code Playgroud)

或者,对于else分支:

{
    T t;
} // end of scope for 't'
return t;
Run Code Online (Sandbox Code Playgroud)

这意味着treturn 语句中的 指的是不存在的实体(在该范围内)。