0

我有以下代码

class A {
   A(int & r)
   : i(r)
   {}

   A(A&& obj)
   : i(obj.i)
   {}

   operator=(A&& obj)
   {
     // ?
   }

   int& i;
}

并想象以下主要

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以使其引用obj.iin operator=()

4

2 回答 2

3

简短的回答是否

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

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

因此,鉴于它不一定在内存中占有一席之地,并且您不能引用它的值(只有它所引用的值),您不能更改引用本身的“值”。这就是为什么在 C++03 中尝试创建常量引用 ( T& const) 是错误的。(然而,在 C++11 中,这是允许的,因为引用折叠,这在引入右值引用时是必需的)

于 2013-01-16T11:11:35.927 回答
0

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

于 2013-01-16T10:56:48.700 回答