如果类的成员是引用,为什么复制对象是非法的?

ath*_*hos 5 c++ copy copy-constructor

我遇到了一个测验,说下面第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 }
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 6

第16行使用复制构造函数,第18行使用赋值运算符operator=.两种不同的功能有不同的限制.

因为引用不能反弹,所以编译器无法生成任何有意义的隐式赋值运算符.因此它拒绝这样做,并产生错误.

复制构造函数第一次生成对象,因此它可以像在您自己的构造函数中一样绑定该引用.


Moh*_*ain 1

C++因为重新分配给引用是非法的。

int &a = some_int;
a = some_other_int; // value copied not reference
a = some_int; // value copied not reference
Run Code Online (Sandbox Code Playgroud)

当您使用赋值运算符(由编译器生成)时,它会盲目地复制对象,从而尝试重新分配给您的引用,因此是无效的。

当您说 时a2 = a1;,编译器会尝试重新分配a1.ra2.r使其在编译时失败,因为它的格式不正确。

您可以将参考视为automatically dereferenced constant pointer. 因此,a2 = a1;由于与下面的类相同的原因,该行将保持格式错误。

struct A
{
  A(int *var) : p(var) {}
  int * const p;
};
Run Code Online (Sandbox Code Playgroud)

  • 重新绑定引用是非法的。甚至没有它的语法。然而,您标记为非法的声明并非如此。 (3认同)
  • @athos 定义“作品”。当您的注释片段完成时,“some_int”将是“5”,“some_other_int”将是“6”,而“a”*仍然*引用“some_int”(正如已经提到的:“5”)。 (2认同)