我遇到了一个测验,说下面第 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 }
最佳答案
第 16 行使用复制构造函数,第 18 行使用赋值运算符 operator=
。具有不同限制的两种不同功能。
因为无法重新绑定(bind)引用,所以编译器无法生成任何有意义的隐式赋值运算符。因此它拒绝这样做,并产生错误。
复制构造函数第一次生成对象,因此它可以像在自己的构造函数中那样绑定(bind)该引用。
关于c++ - 如果类的成员是引用,为什么复制对象是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27792604/