我有以下代码
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=()
?
答案 0 :(得分:3)
简短的回答是否。
为了理解为什么答案是否定的,你需要意识到真正的参考是什么。引用不是指针。实际上,引用甚至不是对象:它只是内存中另一个位置的别名。标准实际上说引用不需要(需要)有一个地址,所以它甚至不需要存在于内存中。如你所知,参考文件(在许多情况下)可以在编译时完全消失。
给定引用变量,您不能使用它来引用引用本身。对其名称的任何使用都将引用它所引用的内存位置。这就是您无法创建指向引用的指针的原因。也就是说,你不能拿参考的地址。哪个好,因为,如前所述,它甚至可能没有地址。
因此,鉴于它不一定在内存中占有一席之地,并且您无法引用其值(仅指其所指的值),您无法更改引用本身的“值”。这就是为什么在C ++ 03中尝试创建常量引用(T& const
)时出错。 (但是,在C ++ 11中,由于引用折叠,这是允许的,这在引入rvalue-references时是必需的)
答案 1 :(得分:0)
在调用构造函数之后调用operator = ,并且引用字段不能保持未初始化 - 您必须在类的构造函数中设置它们。所以答案是否定的。改为使用指针或智能指针。