构造函数中的const int ref可以安全地绑定到文字吗?

Rya*_*ing 9 c++ reference temporary object-lifetime language-lawyer

我知道标准有一个例外,关于延长temporaries的生命周期,基本上说在构造函数中绑定const引用不会延长生命周期,但这是否也适用于文字?例如:

class C {
    private:
        const int& ref;
    public:
        C(const int& in)
            : ref{in}
        { }
};
Run Code Online (Sandbox Code Playgroud)

如果我有一个函数返回这种类型的对象

C f() {
    C c(2);
    return c;
}
Run Code Online (Sandbox Code Playgroud)

c.ref如果我知道它与文字绑定,那么调用者的值是否未定义?

Col*_*mbo 6

.构造函数完成执行后,您将无法使用该引用.
当非类类型的prvalue绑定到const同一类型的引用时,总是引入临时类.因此,构造函数的参数引用将引用一个在引用超出范围时被销毁的临时文件.在那之后,成员引用是悬空的,并且尝试访问该引用后面的存储值会导致UB.[dcl.init.ref]/5:

参考输入" CV1 T1 "是通过类型"的表达初始化CV2 T2 "如下:

  • 如果引用是左值引用和初始化表达式
    • 是左值(但不是位字段),[...]
    • 有一个类类型(即,T2是一个类类型)[..]
  • 否则,引用应是对非易失性const类型的左值引用(即,cv1应为const),或者引用应为右值引用.

    • 如果是初始化表达式

      • 是一个xvalue(但不是一个位字段),类prvalue,数组prvalue或函数lvalue和[..]
      • 有一个类类型[..]
    • 否则:(5.2.2.1)

      • 如果T1是类类型[..]
      • 如果T1是非类类型,则创建临时类型为" cv1 T1 "并从初始化表达式复制初始化(8.5).然后将引用绑定到临时.

不出所料,整数文字确实是prvalues.[expr.prim.general]/1:

字符串文字是左值; 所有其他文字都是prvalues.

最后,如果不清楚,[class.temporary]/5:

绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:

  • 绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.