问题描述
Sub RemoveAllHighlighting()
Dim story As Range
For Each story In ActiveDocument.StoryRanges
story.HighlightColorIndex = wdNoHighlight
Next story
End Sub
我对上述代码的理解是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'
语句之前是否检查未声明的标识符?
解决方法
我对上述代码的理解是f的主体将是
int t = 10; return t;
或
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
表示不存在(在该范围内)的实体。
if constexpr
不是宏;不要这样对待它。它是一个标准的C ++构造,其语法与大多数C ++构造一样。确实,其语法类似于if
(这就是为什么它拼写为“ if constexpr”的原因)。尽管if constexpr
在某些情况下可以丢弃其块之一内的语句,但从语法上来说,这基本上是唯一的特殊之处。
大括号定义名称的范围。在函数内花括号内声明的名称在其外部不可用。这并没有因为您在constexpr
之后写了if
而改变。