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

时间:2013-01-16 10:52:31

标签: c++ reference move

我有以下代码

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.i中的operator=()

2 个答案:

答案 0 :(得分:3)

简短的回答是

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

给定引用变量,您不能使用它来引用引用本身。对其名称的任何使用都将引用它所引用的内存位置。这就是您无法创建指向引用的指针的原因。也就是说,你不能拿参考的地址。哪个好,因为,如前所述,它甚至可能没有地址。

因此,鉴于它不一定在内存中占有一席之地,并且您无法引用其值(仅指其所指的值),您无法更改引用本身的“值”。这就是为什么在C ++ 03中尝试创建常量引用(T& const)时出错。 (但是,在C ++ 11中,由于引用折叠,这是允许的,这在引入rvalue-references时是必需的)

答案 1 :(得分:0)

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