我遇到一个测验,说下面第18行中的代码格式错误,因为“当需要复制的成员之一是引用时,使用隐式定义的赋值运算符是格式错误的。”
我不明白。为什么引用无法复制?为什么第16行合法?第16行与第18行非常相似,复制构造函数仍然需要执行复制,对吗?
1 #include <iostream>
2
3 struct A
4 {
5 A(int& var) : r(var) {}
6
7 int &r;
8 };
9
10 int main(int argc, char** argv)
11 {
12 int x = 23;
13
14 A a1(x);
15
16 A a2 = a1;
17
18 a2 = a1;
19
20 return 0;
21 }
最佳答案
因为在C++
中重新分配给引用是非法的。
int &a = some_int;
a = some_other_int; // value copied not reference
a = some_int; // value copied not reference
当您使用赋值运算符(由编译器生成)时,它盲目地复制对象,从而尝试将其重新赋值给您的引用,因此无效。
当您说
a2 = a1;
时,编译器会尝试将a1.r
重新分配给a2.r
,使其在编译时失败,因为它格式不正确。您可以将引用视为
automatically dereferenced constant pointer
。因此,由于与以下类相同的原因,a2 = a1;
行将保持格式错误。struct A
{
A(int *var) : p(var) {}
int * const p;
};