在`if constexpr`块内声明的变量范围

Per*_*-lk 2 c++ scope constexpr c++17

这是不正确的还是只是编译器(在我的情况下是g ++ - 7)仍然是错误的?因为它说n没有定义.

template<class T>
auto tup(T const& t)
{
    if constexpr(hana::length(t)() % 2)
        auto n = hana::append(t, nullptr);
    else
        auto const& n = t;

    return n;
}

int main()
{
   std::cout << hana::length(tup(std::tuple(3, "h", 'c'))) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

n 将始终定义,无论编译器将进入哪个分支.

asc*_*ler 5

您的程序格式不正确,因为每个程序n都限制在声明它的单个语句的范围内.

C++ 17草案N4659 [stmt.select]/1说:

在该子语句选择语句(每个子语句,在else所述的形式if语句)隐式地定义的块范围([basic.scope]).如果selection-statement中的子语句是单个语句而不是复合语句,则就好像它被重写为包含原始子语句的复合语句一样.[ 例如:

if (x)
  int i;
Run Code Online (Sandbox Code Playgroud)

可以等同地重写为

if (x) {
  int i;
}
Run Code Online (Sandbox Code Playgroud)

因此在if声明之后,i不再在范围内.- 结束例子 ]

此规则适用于所有for,while,switchif条语句-无论是否constexpr关键字使用if.

  • 看到 C++ 标准委员会不明白为什么 `constexpr` 语句的范围规则必须与运行时范围规则不同,真的很糟糕。那么,这些规则的另一个关键字,嗯? (3认同)
  • 我只想说,编译时“if”表达式已经被开发出来,以取代“#if-#else-#endif”,从预处理器编程转移到“constexpr”过程编程,但不是那样他们给这个问题添加了更多的模糊性,并且没有以简单的方式解决这个问题。为什么我们在这里需要另一个层次的复杂性,新的 C++ 不是已经超载了语法糖块,仔细一看只是一堆过度设计的结构吗? (3认同)