如何在C++中初始化对象引用?

One*_*ero 4 c++ reference

我试着这样做

MyClass& x;
x = MyClass(a,b,c);
Run Code Online (Sandbox Code Playgroud)

但是C++不会让我这样做,因为它认为x在开始时是未初始化的.

所以我试着去做

MyClass& x = MyClass(a,b,c);
Run Code Online (Sandbox Code Playgroud)

但得到错误说 invalid initialization of non-const reference of type 'MyClass&' from an rvalue of type 'MyClass'

它出什么问题了?看来我现在根本无能为力.如何解决初始化问题?

Che*_*Alf 9

const必须使用左值表达式(实质上是指代存储器位置的表达式)初始化对非的普通引用,例如

MyClass o{ a, b, c };
MyClass& r = o;
Run Code Online (Sandbox Code Playgroud)

如果引用是const,或者它是rvalue引用(表示为&&),则初始化器可以是rvalue表达式,例如由函数调用生成的临时表达式:

MyClass const& rc = foo();
MyClass&& rr = foo();
Run Code Online (Sandbox Code Playgroud)

在这些情况下,对于本地引用,临时的生命周期将扩展到引用的范围.

并且一个特殊的特性是,如果初始化器生成派生类的临时类,那就是完整的派生类对象,其生命周期被扩展,即对于为引用指定的类没有切片.

更一般地,引用可以绑定到临时的任何部分,只要该部分具有兼容类型,这将延长完整临时对象的生命周期.


art*_*rtm 6

引用必须引用已存在的对象.所以你需要先拥有一个对象才能引用它.

MyClass y = MyClass(a,b,c);
MyClass &x = y;
Run Code Online (Sandbox Code Playgroud)