2016-08-21 65 views
2

的事情是,的C++編程語言第四版說的顯式聲明隱式生成的構造函數:與析構函數

在這種特殊情況下,如果你忘記刪除複製或移動操作,沒有任何的損害。 A 對於用戶已經顯式聲明析構函數的類,不會隱式地生成移動操作。 此外,在這種情況下(第44.2.3節),不贊成使用複製操作。這 可以是一個很好的理由,甚至明確定義析構函數,其中,編譯器會隱含地 提供一個(§17.2.3)。

我試過這段代碼:

#include <iostream> 
class Foo { 
public: 
    ~Foo() {} 
} 
int main() { 
    Foo x; 
    Foo y(x); 
    return 0; 
} 

而且這裏沒有錯誤和產生的異常。我知道複製構造函數應該隱式地在C++ 98中生成,但是第四種說複製已被棄用。這是什麼意思?

回答

1

我的理解是,一個隱式聲明的構造是沒有必要的隱式定義。

cppreference

隱式聲明的拷貝構造函數
如果提供了一個類類型(結構,類或聯合)沒有用戶定義拷貝構造函數,編譯器將始終聲明覆制構造函數作爲其類的非顯式內聯公共成員。

隱式定義的由編譯器拷貝構造
如果隱式地聲明的複製構造既不刪除也不瑣碎,它被定義(即,產生一個函數體和編譯)如果使用ODR-。如果T具有用戶定義的析構函數或用戶定義的複製賦值運算符
的隱式定義的複製構造的生成已被棄用。

所以你的情況,拷貝構造函數是隱式聲明,但不隱式定義如果不是ODR使用的,這基本上意味着,除非需要它的地方沒有定義。

另請參閱:What is the distinction between implicitly-declared and implicitly-defined copy constructors?

+0

謝謝Nelxiost – user2923317