2014-12-24 14 views
3

編譯器可以隱式地爲我們定義需要的一些函數,以及它們是否可以爲該類正確定義。像編譯器生成的拷貝構造函數/賦值是否使用const/volatile描述它的參數

  • 默認構造函數
  • 拷貝構造函數
  • 賦值運算符
  • 析構函數。

因此,編譯器生成的拷貝構造函數/賦值是否將它的參數設爲const-referencenon-const-reference

class Test 
{ 
    public: 
    Test(const Test&);  << _1 
    Test(Test&);   << _2 
}; 

如果確實如此,那麼決定的指導因素是什麼。

+4

隱式定義的複製構造函數[here](http://en.cppreference.com/w/cpp/language/copy_constructor)的規則可能會有所幫助。根據鏈接,根據類的父母的拷貝構造函數,可以是「const Test」或「Test&'。 – Pradhan

回答

1

link普拉丹的規則在評論中提供可以直觀地理解爲:編譯器將嘗試定義與說法const T&如果可能的話拷貝構造函數;如果不是那麼它將嘗試定義一個複製構造函數與參數T&;如果這也不可能,那麼複製構造函數將被定義爲刪除。

複製類類型爲T的對象時,也必須複製其基類和非靜態數據成員。所以如果其中的一個,例如U有一個複製構造函數需要U&而不是const U&,那麼如果T的構造函數需要const T&,那麼這是一個禁止行爲,因爲所有子對象都將被cv限定,並且您無法獲得U&。因此編譯器不得不放棄製作一個需要const T&的拷貝構造函數,而是用T&來代替。同樣,如果複製某些基類或非靜態數據成員不能,那麼編譯器爲T生成已刪除的複製構造函數是有意義的。

對於複製賦值運算符,除編譯器查找基類和非靜態數據成員(而不是它們的複製構造函數)的複製賦值運算符外,規則基本相同,並且複製賦值運算符可以採用他們的參數的價值(不像複製構造函數)。

相關問題