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

问题描述

play with the code.

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而改变。