初始化后修改引用所引用的对象

Modify the object on which a reference refer after initialization

本文关键字:引用 对象 初始化 修改      更新时间:2023-10-16

我有以下代码

class A {
   A(int & r)
   : i(r)
   {}
   A(A&& obj)
   : i(obj.i)
   {}
   operator=(A&& obj)
   {
     // ?
   }
   int& i;
}

想象下面的main

int main()
{
   int r = 12;
   int r2 = 21;
   A a(r);
   A b(r2);
   b = std::move(a);
   r = 42;
   std::cout << "b.i value is " << b.i << std::endl;
}

我希望它打印出b.i value is 42

简而言之,是否有可能将i修饰为operator=()中的obj.i ?

简短的回答是No

为了理解为什么答案是否定的,你需要了解什么是真正的引用。引用不是指针。事实上,引用甚至不是对象:它只是内存中另一个位置的别名。标准实际上说引用不需要有地址,所以它甚至不需要存在于内存中。众所周知,引用(在许多情况下)可能在编译时完全消失。

给定一个引用变量,不能用它来引用引用本身。对其名称的任何使用都将指向它所指向的内存位置。这就是为什么不能创建指向引用的指针。也就是说,不能取引用的地址。这很好,因为,如前所述,它甚至可能没有地址。

因此,考虑到它不一定在内存中有一个位置,并且您不能引用它的值(只有它所引用的值),您不能更改引用本身的"值"。这就是为什么在c++ 03中尝试创建一个常量引用(T& const)是错误的。(然而,在c++ 11中,这是允许的,因为引用折叠,这在引入右值引用时是必要的)

Operator =在构造函数被调用后被调用,并且引用字段不能保持未初始化—您必须在类的构造函数中设置它们。所以答案是否定的。请使用指针或智能指针。