【问题标题】:Why do I get "use of undeclared identifier" even when using constexr if?为什么即使在使用 constexr if 时我也会得到“使用未声明的标识符”?
【发布时间】:2021-01-22 12:13:30
【问题描述】:

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 不等于 #if/#else(您似乎想要)

标签: c++ if-statement constexpr undeclared-identifier


【解决方案1】:

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

花括号定义名称的范围。在函数内的花括号内声明的名称在它们之外不可用。这并没有因为您在if 之后写constexpr 而改变。

【讨论】:

    【解决方案2】:

    我对上面代码的理解是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 指的是不存在的实体(在该范围内)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多