为什么即使使用 constexpr if 也会得到 "use of undeclared identifier"?

Why do I get "use of undeclared identifier" even when using constexr if?

play with the code.

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

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

int t = 10; 
return t;

T t = // some default value for T 
return t;

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

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

if constexpr 不是宏;不要这样对待它。它是一个标准的 C++ 结构,它的语法与大多数 C++ 结构一样。事实上,它的语法类似于 if(这就是为什么拼写为“if constexpr”)。虽然 if constexpr 能够在某些情况下丢弃其中一个块中的语句,但这基本上是它在语法上的唯一特殊之处。

花括号定义名称的范围。在函数内部的大括号内声明的名称在它们外部不可用。这并没有改变只是因为你在 if.

之后写了 constexpr

My understanding of the above code is that the body of f will either be

int t = 10; 
return t;

or

T t = // some default value for T 
return t;

没有。更有效的比较是,对于 true 分支,它将是:

{
    int t = 10;
} // end of scope for 't'
return t;  // 

或者,对于 else 分支:

{
    T t;
} // end of scope for 't'
return t;

表示 return 语句中的 t 指的是不存在的实体(在该范围内)。