首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何初始化常量表达式引用

如何初始化常量表达式引用
EN

Stack Overflow用户
提问于 2015-02-20 02:54:14
回答 3查看 7.9K关注 0票数 28

我正在尝试初始化constexpr引用,但没有成功。我试过了

代码语言:javascript
复制
#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

所以我的问题是:

  1. constexpr引用有用吗?(也就是说,比references)
  2. If const更好是的,我如何有效地定义它们?

PS:我已经看到了一些与我的问题相关的问题,比如Which values can be assigned to a constexpr reference?,但我不认为它们能解决我的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-20 02:58:27

constexpr引用

  1. 有用吗?(即,比常量引用“更好”)

它们保证在程序启动之前初始化,而对const的引用可以在程序开始运行后的动态初始化过程中初始化。

  1. 如果是,我如何有效地定义它们?

constexpr引用必须绑定到全局变量,而不是局部变量(或者更正式地说,它必须绑定到具有静态存储持续时间的对象)。

引用在概念上等同于获取变量的地址,而局部变量的地址不是常量(即使在main中也是如此,因为它只能被调用一次,所以它的局部变量只被初始化一次)。

票数 30
EN

Stack Overflow用户

发布于 2015-02-20 03:04:14

所以问题是,constexpr引用需要绑定到一个具有静态存储持续时间的对象,这在draft C++11 standard: N3337小节5.19 expr.const (我的重点)中有介绍:

引用常量表达式是一个左值核心常量表达式,用于指定具有静态存储持续时间或函数的对象

draft C++14 standard: N3936会更改措辞:

常量表达式既可以是glvalue核心常量表达式,其值引用具有静态存储持续时间的对象或函数,也可以是prvalue核心常量表达式,其值是对象,其中,对于该对象及其子对象:

  • 引用类型的每个非静态数据成员引用具有静态存储持续时间的对象或函数,以及
  • 如果对象或子对象属于指针类型,则它包含具有静态存储持续时间的对象的地址、超过此类对象结尾的地址(5.7)、函数的地址或空指针值。

因此,像这样更改x的声明是可行的:

代码语言:javascript
复制
constexpr static int x{20};
票数 11
EN

Stack Overflow用户

发布于 2015-02-20 03:05:11

正如T.C.所说,初始化器需要是一个具有静态存储持续时间的对象。

N4140/§5.19/4常量表达式要么是glvalue核心常量表达式,其值是具有静态存储持续时间的对象...

N4140/§7.1.5/9对象声明中使用的constexpr说明符将对象声明为常量。这样的对象应该是文本类型,并且应该被初始化。..。否则,或者如果在引用声明中使用了constexpr说明符,则出现在其初始值设定项中的每个完整表达式都应该是常量表达式。

在N3337中,措辞是不同的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28614591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档