帶引用成員的類沒有默認提供的複製/移動賦值運算符。建立綁定後,引用不能被引用到另一個變量。簡而言之,複製構造函數正在進行初始建立,而默認賦值運算符將嘗試更改它綁定後。
因此,標準將這種情況稱爲默認複製和移動賦值操作符。
C++ 11§12.8p23
類X A拖欠複製/移動賦值運算符被定義爲已刪除如果X具有:
- 用的變體構件非平凡對應賦值運算符,X是類聯合類,或者是非常量非類類型(或其數組)的非靜態數據成員或
- 參考類型的非靜態數據成員或
- 類型爲M(或其數組)的非靜態數據成員,由於重載解析而無法複製/移動(13。3)適用於M的相應賦值運算符,會導致從默認賦值運算符或直接或虛擬基類B中刪除或無法訪問的含糊不清或功能,這些直接或虛擬基類B由於過載分辨率而無法複製/移動適用於B的相應賦值運算符,會導致從默認賦值運算符中刪除或無法訪問的歧義或函數,或移動賦值運算符,非靜態數據成員或直接基類與一個沒有移動賦值運算符並且不是可微複製的類型,或者任何直接或間接的虛擬基類。
您當然可以自己編寫過載。
#include <iostream>
struct A
{
A(int& var) : r(var) {}
int &r;
A& operator=(const A& obj)
{
r = obj.r; // value copied, reference-binding remains the same
return *this;
}
};
int main(int argc, char** argv)
{
int x = 42;
int y = 43;
A a1(x);
A a2(y);
A a3 = a1; // legal. default copy-ctor invoked
a3 = a2; // legal. user-defined copy-assignment invoked
std::cout << x << ',' << y << '\n';
return 0;
}
輸出
43,43
但這不會(且不能)重新綁定參考。此處提供的過載將更改參考的數據;而不是引用本身。這種區分很重要。
希望這會有所幫助。
[你打算髮布整個測驗?](http://stackoverflow.com/questions/27792560/c-why-constructor-aa-a-is-illegal) – WhozCraig
啊..這是有道理的。 grats 97.4%測試順便說一句。 – WhozCraig
非法*分配*,而不是*複製*。 – Potatoswatter