vso*_*tco 21 c++ reference constexpr c++11
我试图初始化一个constexpr
参考没有成功.我试过了
#include <iostream>
constexpr int& f(int& x) // can define functions returning constexpr references
{
return x;
}
int main()
{
constexpr int x{20};
constexpr const int& z = x; // error here
}
Run Code Online (Sandbox Code Playgroud)
但我得到编译时错误
错误:constexpr变量'z'必须由常量表达式初始化
删除const
结果
错误:将类型'int'的引用绑定到类型'const int'的值会删除限定符
即使我有一种constexpr
自动暗示const
变量声明的感觉.
所以我的问题是:
constexpr
参考以往有用吗?(即比const
参考文献"更好" )PS:我看过几个与我有关的问题,例如哪些值可以分配给`constexpr`参考?,但我不认为他们解决了我的问题.
Jon*_*ely 24
- constexpr引用是否有用?(即,比const引用"更好")
保证在程序启动之前初始化它们,而在程序开始运行之后,可以在动态初始化期间初始化对const的引用.
- 如果是,我该如何有效地定义它们?
一个constexpr
参考具有绑定到一个全球性的,而不是一个局部变量(或者更正式,它必须绑定与静态存储时间的东西).
引用在概念上等同于获取变量的地址,并且局部变量的地址不是常量(即使main
只能调用一次,因此其局部变量仅初始化一次).
所以问题是constexpr引用需要绑定到具有静态存储持续时间的对象,这在C++ 11标准草案中有所涉及:N3337 section 5.19
[expr.const](强调我的):
引用常量表达式是左值核心常量表达式,用于指定具有静态存储持续时间或函数的对象
在C++草案标准14:N3936改变措词:
常量表达式是glvalue核心常量表达式,其值是指具有静态存储持续时间的对象或函数,或者是prvalue核心常量表达式,其值是一个对象,对于该对象及其子对象:
- 引用类型的每个非静态数据成员是指具有静态存储持续时间或对象的对象,以及
- 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址,超过此类对象的结尾的地址(5.7),函数的地址或空指针值.
所以改变这样的声明x
会起作用:
constexpr static int x{20};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5323 次 |
最近记录: |