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

Leo*_*aar 19 c++ const constexpr c++11 c++14

例如:

constexpr int g() { return 30; }    

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

    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

没有必要constexpr函数中声明局部变量const

局部变量的constexpr函数不等于没有const局部变量的函数吗?const

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

小智 23

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

  • 声明变量const记录了它永远不会被更改的事实.在某些情况下,这可能有助于使函数更具可读性.
  • 声明一个变量const会影响重载决策,并且可能使h(x)解决h不同,这取决于是否xconst.

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

即使在constexpr函数中,也可以改变局部变量.如果这些变量随后被const更改,则不再接受尝试更改它们.

  • 当然,const局部变量不能在返回时移动.出于这个原因,我非常警惕const当地人. (4认同)

How*_*ant 16

这个特定的例子中的局部变量将最好的宣布constexpr,没有const,因为他们可以在编译时计算:

constexpr int g() { return 30; }    

constexpr int f()
{
    constexpr int x = g();
    constexpr int y = 10;

    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

f()被称为在运行时,没有constexprxy,(有或没有constxy)你给编译器初始化选项x,并y在运行时,而不是编译时间.使用constexpron xy,编译器计算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;
}
Run Code Online (Sandbox Code Playgroud)

现在x无法标记constexpr因为z可能不是编译时常量,并且目前无法将其标记为此类.所以在这种情况下,标记x const是你能做的最好的.