我遇到一个测验,说下面第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;
};

08-05 18:30
查看更多