当前位置: 首页 > 知识库问答 >
问题:

如何初始化Constexr引用

上官飞
2023-03-14

我试图初始化一个< code>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”必须由常量表达式初始化

删除< code>const会导致

错误:将对类型“int”的引用绑定到类型“const int”的值会删除限定符

尽管我感觉< code>constexpr自动暗示变量声明的< code>const。

所以我的问题是:

    < Li > < code > const expr 引用有用吗?(即“优于”< code>const参考) < li >如果是,我如何有效地定义它们?

PS:我看到了一些与我相关的问题,例如哪些值可以分配给“constexpr”引用,但我认为他们没有回答我的问题。

共有3个答案

岳凯康
2023-03-14

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

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

N4140/§7.1.5/9在对象声明中使用的const说明符将对象声明为const。这样的对象应具有文字类型并应进行初始化。[…]否则,或者如果在引用声明中使用了constexr说明符,则出现在其初始化器中的每个完整表达式都应是常量表达式。

N3337中的措辞不同。

明阳旭
2023-03-14

所以问题是constexpr引用需要绑定到一个具有静态存储持续时间的对象,这在C 11标准草案:n 3337 section < code > 5.19 [expr . const](强调我的)中有所涉及:

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

C 14标准草案:N3936更改了措辞:

常量表达式要么是 glvalue 核心常量表达式,其值是指具有静态存储持续时间的对象或函数,要么是 prvalue 核心常量表达式,其值是一个对象,其中,对于该对象及其子对象:

    < li >引用类型的每个非静态数据成员引用具有静态存储持续时间的对象或函数,并且 < li >如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象结束后的地址(5.7)、函数的地址或空指针值。

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

constexpr static int x{20};
楮星鹏
2023-03-14
  1. constexpr引用是否有用?(即,“优于”常量引用)

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

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

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

 类似资料:
  • 当云联壹云的First Node部署成功后,用户可根据使用场景快速引导配置云联壹云平台。 设置管理员用户 当First Node节点部署完成后,用户在浏览器中输入First Node节点的IP地址,如提示“您的连接不是私密连接”,请单击 “高级” 按钮,并单击“继续前往x.x.x.x(不安全)”,打开云管平台控制台。 在管理员注册页面,设置管理员账号、密码,单击 “注册” 按钮,创建管理员用户。

  • 在Java中,可以用null初始化引用变量,例如,字符串变量可以像下面这样初始化:

  • 我有一个非常基本的问题。我需要如何为ArrayList键入parrameters才能在BlueJ中使用代码?我有一个方法如下。

  • 问题内容: 错误 码 问题答案: 您需要初始化 ,如错误消息所示,您仅对其进行了声明。 您需要初始化数组,以便可以 在 开始设置索引 之前 为元素分配正确的内存存储。 __ 如果 仅 声明数组(如您所做的那样),则不会为元素分配内存,而只会分配给的引用句柄,并且尝试在任何索引处初始化变量时都会引发错误。 另外,您也可以在花括号内初始化数组,这样, 相当于

  • 我正在尝试初始化,但它不允许我。我已经能够初始化。

  • 我有个问题. 如何使用我在前面的 StackOverflow 问题中找到的方法初始化 JavaFX 工具包?可以在此处找到该主题:JavaFX 2.1:工具包未初始化 我正在尝试从该线程使用类似于此解决方案的解决方案: 问题:非平凡的Swing GUI应用程序需要运行JavaFX组件。应用程序的启动过程在启动依赖服务层后初始化GUI。 解决方案子类JavaFX应用程序类,并在单独的线程中运行,例如