我们可以在constexpr函数中省略局部变量的const吗
Can we omit const on local variables in constexpr functions?
例如:
constexpr int g() { return 30; }
constexpr int f()
{
// Can we omit const?
const int x = g();
const int y = 10;
return x + y;
}
在具有const
的constexpr
函数中是否存在任何点声明局部变量?
具有const
局部变量的constexpr
函数是否与不具有const
的函数等价?
换句话说,函数上的constexpr
是否将(暗示)const
强加给其局部变量?
在非constexpr
函数中声明变量为const
的参数也适用于constexpr
函数:
- 声明一个变量
const
记录了它永远不会被更改的事实。在某些情况下,这可能有助于提高函数的可读性 - 声明变量
const
会影响过载分辨率,并且可能会使h(x)
根据x
是否为const
对h
进行不同的解析
当然,正如已经在评论中提到的那样,朝着相反的方向:
即使在constexpr
函数中,局部变量也可能发生变化。如果这些变量随后被更改为const
,则将不再接受更改它们的尝试。
在这个特定的例子中,局部变量最好声明为constexpr
,而不是const
,因为它们可以在编译时计算:
constexpr int g() { return 30; }
constexpr int f()
{
constexpr int x = g();
constexpr int y = 10;
return x + y;
}
当在运行时调用f()
时,在x
和y
上没有constexpr
(在x
和y
上有或没有const
),编译器可以选择在运行时而不是在编译时初始化x
和y
。对于x
和y
上的constexpr
,编译器应在编译时计算x
和y
,即使在运行时执行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。
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 为什么不能在模板函数中向局部变量添加低级 const 类型
- 静态对const局部变量有所作为
- 我是否应该将 const 用于局部变量以获得更好的代码优化
- 我们可以在constexpr函数中省略局部变量的const吗
- 从lambda返回局部变量到const ref
- 在c++中声明一个局部变量const的好处,如果它的值在编译时不知道