[C++11: 12.8/7]:
如果類定義沒有顯式地聲明一個拷貝構造函數,那麼它是隱式聲明的。 如果類定義聲明移動構造函數或移動賦值運算符,則隱式聲明的複製構造函數被定義爲刪除; 否則,它被定義爲默認(8.4)。如果類具有用戶聲明的複製賦值運算符或用戶聲明的析構函數,則不推薦使用後一種情況。因此,對於類定義[C++ 11:12.8/7]有意義嗎?struct X { X(const X&, int); };
複製構造函數是隱式聲明的。如果用戶聲明的構造將在後面定義爲
X::X(const X& x, int i =0) { /* ... */ }
然後任何使用
X
的拷貝構造是形成不良的,因爲歧義的;不需要診斷。
這對我沒有多大意義。
「由此」引入的代碼示例與我以斜體突出顯示的「後一種」情況有什麼關係?
我的理解至今是:
- 如果類定義不明確聲明拷貝構造函數,
- 類定義不聲明移動構造函數或移動賦值操作符和
- 該類有一個聲明用途的拷貝賦值操作符或一個用戶聲明的析構函數,然後
- 隱式定義的拷貝構造函數被定義爲
default
ed,並且這已被棄用。
這似乎本身就奇怪,一個標準的授權行爲相提並論—棄用—。這是否意味着擁有滿足這三個條件的班級已被棄用?
代碼示例與它有什麼關係?該構造函數不是複製構造函數,移動構造函數,移動賦值運算符,複製賦值運算符或用戶聲明的析構函數;它只是一個用戶聲明的構造函數,不是嗎?這個「模糊」在哪裏?
有人能爲我解碼這段經文嗎?
我更加困惑於函數定義中的默認參數。 – 2012-01-13 11:46:40
是的,這似乎是一個奇怪的例子,在一個已經很奇怪的段落。 – 2012-01-13 11:47:30
@SimonRichter你可以將它們放在聲明或定義中,但不能同時放在兩者中。我自己,我從來沒有把它放在定義中...... – 2012-01-13 11:49:44