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)
第16行使用复制构造函数,第18行使用赋值运算符operator=.两种不同的功能有不同的限制.
因为引用不能反弹,所以编译器无法生成任何有意义的隐式赋值运算符.因此它拒绝这样做,并产生错误.
复制构造函数第一次生成对象,因此它可以像在您自己的构造函数中一样绑定该引用.
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.r以a2.r使其在编译时失败,因为它的格式不正确。
您可以将参考视为automatically dereferenced constant pointer. 因此,a2 = a1;由于与下面的类相同的原因,该行将保持格式错误。
struct A
{
A(int *var) : p(var) {}
int * const p;
};
Run Code Online (Sandbox Code Playgroud)