2012-01-13 48 views
4

[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,並且這已被棄用

這似乎本身就奇怪,一個標準的授權行爲相提並論—棄用—。這是否意味着擁有滿足這三個條件的班級已被棄用?

代碼示例與它有什麼關係?該構造函數不是複製構造函數,移動構造函數,移動賦值運算符,複製賦值運算符或用戶聲明的析構函數;它只是一個用戶聲明的構造函數,不是嗎?這個「模糊」在哪裏?

有人能爲我解碼這段經文嗎?

+0

我更加困惑於函數定義中的默認參數。 – 2012-01-13 11:46:40

+0

是的,這似乎是一個奇怪的例子,在一個已經很奇怪的段落。 – 2012-01-13 11:47:30

+0

@SimonRichter你可以將它們放在聲明或定義中,但不能同時放在兩者中。我自己,我從來沒有把它放在定義中...... – 2012-01-13 11:49:44

回答

3

這是否意味着滿足這三個條件的類已被棄用?

是的;如果您有使用聲明的複製賦值運算符或析構函數,則還應該聲明覆制構造函數。基本上只是說你的班級應該遵循Rule of Three(或5,或者其他所謂的C++ 11)。

這似乎很奇怪,標準規定的行爲是 - 在相同的呼吸 - 不贊成使用。

該行爲由標準強制規定,因爲那是C++ 03中的行爲 - 更改它會破壞遺留代碼。正如標準定義(例如)動態異常規範的行爲一樣,並且也將其棄用。

「由此」引入的代碼示例與我以斜體突出顯示的「後一種」情況有什麼關係?

它與「後者」案沒有任何關係。

這是由子句定義的正常行爲引起的潛在問題的說明:隱式聲明的複製構造函數與用戶聲明的構造函數之間會存在衝突,並且可能會調用默認參數像複製構造函數一樣。

這是什麼「模棱兩可」?

考慮代碼:

X x1; // assume there's also a default constructor 
X x2(x); 

應該x2與用戶聲明的構造(與第二個參數取默認值)時被初始化,或隱式聲明的拷貝構造函數?兩者對使用情況同樣適用。這是含糊不清的。

+0

謝謝;細分。 :)標準段落中應該有更多的換行符,methinks。 – 2012-01-13 12:10:14

3

只是回答第二部分。含糊不清是由於缺省參數int i = 0,它允許只使用第一個參數const X& x來調用構造函數,這允許它也可以用作複製構造函數,因爲它與X(const X& x)(§12.8/ 2確切的文字)。這與隱式拷貝構造函數衝突,因此含糊不清。

+0

現在我感覺有點無聊。 – 2012-01-13 11:46:34

2

它似乎是澄清移動構造函數的作用以及它如何影響複製構造函數。這是說如果你聲明一個移動構造函數或一個移動賦值操作符,那麼將不會有隱式拷貝構造函數。如果你已經定義了你自己的拷貝構造函數或拷貝賦值操作符,你可以忽略你放在黑體文本中的位。

我覺得示例的重點是要表明,該類:

struct X { 
    X(const X&, int); 
}; 

拷貝構造函數隱含定義,因爲沒有用戶定義拷貝構造函數。但是,如果你提供第二個int參數的默認值(因爲他們已經完成),然後一個電話:

X newX(oldX); 

可能是用戶定義的構造函數或拷貝構造函數的調用:這是含糊不清他們談到。

+0

哦,因爲默認的參數。杜對我。 – 2012-01-13 11:46:21

+0

@LightnessRacesinOrbit哦,至少那是簡單的事情。 – 2012-01-13 11:49:21

+0

「用戶定義的構造函數或複製構造函數」< - 不明確。兩者都是複製構造函數。 – 2012-01-13 18:20:21