我正在尝试初始化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
}
但是我得到了一个编译时错误
错误: constexpr变量'z‘必须由常量表达式初始化
删除const
的结果是
错误:对类型'int‘的引用与类型'const int’的值的绑定删除了限定符
尽管我感觉constexpr
会自动为变量声明暗示const
。
所以我的问题是:
constexpr
引用有用吗?(也就是说,比references)const
更好是的,我如何有效地定义它们?PS:我已经看到了一些与我的问题相关的问题,比如Which values can be assigned to a constexpr
reference?,但我不认为它们能解决我的问题。
发布于 2015-02-20 02:58:27
constexpr引用
它们保证在程序启动之前初始化,而对const的引用可以在程序开始运行后的动态初始化过程中初始化。
constexpr
引用必须绑定到全局变量,而不是局部变量(或者更正式地说,它必须绑定到具有静态存储持续时间的对象)。
引用在概念上等同于获取变量的地址,而局部变量的地址不是常量(即使在main
中也是如此,因为它只能被调用一次,所以它的局部变量只被初始化一次)。
发布于 2015-02-20 03:04:14
所以问题是,constexpr引用需要绑定到一个具有静态存储持续时间的对象,这在draft C++11 standard: N3337小节5.19
expr.const (我的重点)中有介绍:
引用常量表达式是一个左值核心常量表达式,用于指定具有静态存储持续时间或函数的对象
draft C++14 standard: N3936会更改措辞:
常量表达式既可以是glvalue核心常量表达式,其值引用具有静态存储持续时间的对象或函数,也可以是prvalue核心常量表达式,其值是对象,其中,对于该对象及其子对象:
因此,像这样更改x
的声明是可行的:
constexpr static int x{20};
发布于 2015-02-20 03:05:11
正如T.C.所说,初始化器需要是一个具有静态存储持续时间的对象。
N4140/§5.19/4常量表达式要么是glvalue核心常量表达式,其值是具有静态存储持续时间的对象...
N4140/§7.1.5/9对象声明中使用的constexpr
说明符将对象声明为常量。这样的对象应该是文本类型,并且应该被初始化。..。否则,或者如果在引用声明中使用了constexpr
说明符,则出现在其初始值设定项中的每个完整表达式都应该是常量表达式。
在N3337中,措辞是不同的。
https://stackoverflow.com/questions/28614591
复制相似问题