[英]Confusion about Copy Constructor in C++
碼:
class A
{
public:
A()
{
cout<<"Defualt Constructor"<<endl;
}
A(A &t)
{
cout<<"Copy Constructor"<<endl;
}
};
A func()
{
cout<<"In func"<<endl;
}
int main()
{
A a1;
A a2;
a2 = func();
return 0;
}
該程序工作正常。 另外,如果我這樣調用函數:
A a2 = func();
並在復制 構造函數參數中添加const
限定符,例如:
A(const A &t)
{
cout<<"Copy Constructor"<<endl;
}
此外,工作正常。
但是,如果從復制構造函數參數中刪除const
,例如:
A(A &t)
{
cout<<"Copy Constructor"<<endl;
}
並調用函數func()
A a2 = func();
編譯器給出錯誤:
error: invalid initialization of non-const reference of type 'A&' from an rvalue of type 'A'
A a2 = func();
^
prog.cpp:13:9: note: initializing argument 1 of 'A::A(A&)'
A(A &t)
^
為什么在最后一種情況下編譯器會給出錯誤?
A a2 = func();
是復制初始化 , a2
將通過func()
返回的對象通過復制構造func()
進行初始化。 func()
按值返回,所以它返回的是臨時值,不能綁定到非常量的左值引用(即A &
),這就是為什么會出現錯誤。
臨時可以綁定到const
左值引用(或右值引用),因此將參數類型更改為const A &t
(或添加move構造函數)將使其工作正常。
順便說一句: a2 = func();
與副本構造函數無關,但與副本分配運算符無關。 您沒有為A
聲明它,而隱式聲明的副本賦值運算符將const A&
作為參數,那么就可以了。
BTW2: func()
返回任何內容。 請注意, 從非void函數的末尾流出而不返回 UB。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.