为什么即使在使用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而改变。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...