2016-11-15 107 views
0

要禁止拷貝構造函數和賦值運算符,很顯然,我們可以做決定,因爲C++ 11:把殘疾人拷貝構造函數在私人

class A { 
public: 
    A(const A&) = delete; 
    A& operator=(const A&) = delete; 
} 

或C++ 03:

class A { 
private: 
    A(const A&); 
    A& operator=(const A&); 
} 

然而,用什麼發生這種情況:

class A { 
private: 
    A(const A&) = delete; 
    A& operator=(const A&) = delete; 
} 

我想這也導致了同樣的結果。有什麼副作用嗎?

+1

你爲什麼不嘗試它,看看會發生什麼。 –

+0

[C++語法:默認和刪除修飾符](http://stackoverflow.com/q/16770492/636019)和/或[顯式刪除C++ 11中的成員函數,是否值得繼承一個不可複製的基類?](http://stackoverflow.com/q/9458741/636019) – ildjarn

+0

我試過了。所有三個工作都一樣。 – pepero

回答

4

無論你給一個被刪除的函數什麼訪問都沒有關係 - 它根本不存在(¹),所以無論調用者如何都無法訪問。

錯誤消息可能會稍微混淆。例如參見http:://cpp.sh/9hv7y,其中第一個錯誤是關於「私人」而不是「刪除」。


¹「它不存在」是一種簡化。它存在於它參與重載分辨率的意義上,但如果它是所選函數則是錯誤的。因此,

struct only_double { 
    only_double(intmax_t) = delete; 
    only_double(double arg); 
}; 
only_double zero(0); // Error - deleted constructor called 
+0

是的,刪除函數實際上並不存在,所以accessor無關緊要。這解釋了。謝謝! – pepero

+0

我不認爲說_it不存在_是正確的。請注意 - _一個定義規則適用於已刪除的定義_。有關更多詳細信息,請參閱[此處](http://eel.is/c++draft/dcl.fct.def.delete#4)。 – skypjack

+0

@skypjack:是的。在問題的背景下是這樣,但我添加了一個腳註(最終結果比真實答案長!) –