根據「內部C++對象模型」,只有在以下四個條件中至少有一個條件爲真時,纔會生成複製構造函數(如果程序員未聲明):什麼時候在C++中生成默認構造函數
當類包含一個複製構造函數存在的類的成員對象時(或者由類設計器顯式聲明,就像前一個String類的情況一樣,或者由編譯器合成) Word類)
當這個類是從一個複製構造函數存在的基類派生的(同樣,明確地聲明或合成的)
當類聲明一個或多個虛擬功能
當類是從其中一個或多個基類是虛擬繼承鏈衍生
這意味着如果我只有構造函數的類,那麼複製構造函數將不會被編譯器提供。
讓我們舉個例子:
class test
{
test(){}
};
int main()
{
test obj1; //statement 1
test obj2(obj1); //statement 2
}
上面的代碼工作正常。現在問題來了,當我在類測試中添加以下行:
test(const test& rhs) = delete;
「= delete」確保複製構造函數不會自動提供。添加上面的行後,我得到一個錯誤報告說2 Use of deleted function test::test(const test&)
。我的問題是:按照「內部C++對象模型」我不需要上述類的複製構造函數,所以當我明確說不生成複製構造函數(使用刪除)爲什麼我得到一個錯誤?因爲我期待編譯器不需要上述類的複製構造函數。
我使用的是gcc版本4.6.3。
如果沒有提供_copy-constructor_,那麼您的語句2將不會編譯。 –
它工作正常,如果我不添加測試(常量測試和rhs)在課堂上。 – user1431221
語句2不使用默認構造函數,它使用複製構造函數,並且如果聲明瞭它並將其刪除(您所做的),那麼它將不會編譯,因爲語句2會匹配已刪除的簽名。 – birryree