我们可以在constexpr函数中省略局部变量的const吗

Can we omit const on local variables in constexpr functions?

本文关键字:局部变量 const 中省 函数 constexpr 我们      更新时间:2023-10-16

例如:

constexpr int g() { return 30; }    
constexpr int f()
{
    // Can we omit const?
    const int x = g();
    const int y = 10;
    return x + y;
}

在具有constconstexpr函数中是否存在任何点声明局部变量?

具有const局部变量constexpr函数是否与不具有const的函数等价

换句话说,函数上的constexpr是否将(暗示)const强加给其局部变量?

在非constexpr函数中声明变量为const的参数也适用于constexpr函数:

  • 声明一个变量const记录了它永远不会被更改的事实。在某些情况下,这可能有助于提高函数的可读性
  • 声明变量const会影响过载分辨率,并且可能会使h(x)根据x是否为consth进行不同的解析

当然,正如已经在评论中提到的那样,朝着相反的方向:

即使在constexpr函数中,局部变量也可能发生变化。如果这些变量随后被更改为const,则将不再接受更改它们的尝试。

这个特定的例子中,局部变量最好声明为constexpr,而不是const,因为它们可以在编译时计算:

constexpr int g() { return 30; }    
constexpr int f()
{
    constexpr int x = g();
    constexpr int y = 10;
    return x + y;
}

当在运行时调用f()时,在xy上没有constexpr(在xy上有或没有const),编译器可以选择在运行时而不是在编译时初始化xy。对于xy上的constexpr,编译器应在编译时计算xy,即使在运行时执行f()也是如此。

然而,在不同的函数中,constexpr不能总是被使用。例如,如果f()g()采用了一个参数:

constexpr int g(int z) { return z+30; }    
constexpr int f(int z)
{
    const int x = g(z);
    constexpr int y = 10;
    return x + y;
}

现在x不能被标记为constexpr,因为z可能不是编译时常数,并且目前没有办法将其标记为这样。因此,在这种情况下,标记x const是您能做的最好的事情。

您不仅可以,而且有时必须如果变量发生变化),例如

constexpr size_t f(size_t n) {
    size_t val = 1;
    if (n == 0) val++;
    return val;
}
char arr0[f(0)] = {'a', 'x'};
char arr1[f(1)] = {'y'};

在C++14中是可以的。

通常,函数不能在编译时求值,因此不能在常量表达式中调用。将函数指定为constexpr表示如果其输入参数是常量,则可以在常量表达式中使用该函数。例如这个。。。

constexpr int n = func(7);

必须在编译时进行评估。

这就是constexpr在函数之前的含义。在这种情况下,函数内部的局部变量不必指定为const。