为什么即使使用 constexpr if 也会得到 "use of undeclared identifier"?
Why do I get "use of undeclared identifier" even when using constexr if?
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
指的是不存在的实体(在该范围内)。
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
指的是不存在的实体(在该范围内)。