[英]How does boost::noncopyable work
在我的C ++實踐中,我偶然發現了兩個愚蠢的問題:
c ++拷貝構造函數和賦值運算符中的AFAIK不是繼承的......那么在這種情況下boost :: noncopyable如何幫助禁止這些東西呢?
\n class X:private boost :: noncopyable\n {\n };\n是否有必要僅使用私有繼承來實現目標?
是否只有一種方法來聲明賦值運算符
\n MyClass&operator =(const MyClass&);\n申報是否同樣如此
\n void operator =(const MyClass&);要么
\n const MyClass&operator =(const MyClass&);?
您是正確的,不會繼承復制構造函數和復制賦值運算符。 幸運的是,我們不需要繼承它們才能使其工作。 如果繼承自無法復制的類,則無法復制該派生類,也無法在其復制構造函數中調用基類復制構造函數。
你必須從一個看起來像的類繼承
struct NonCopyable {
NonCopyable & operator=(const NonCopyable&) = delete;
NonCopyable(const NonCopyable&) = delete;
NonCopyable() = default;
};
這足以阻止編譯器在派生類中生成的副本和賦值工作。 你可以提供自己的並覆蓋它,但那就是打敗了這一點。
C ++ 11及更高版本中的不可復制將通過聲明它=delete
,最好是公共的。 但是,在C ++ 11之前,這是不可能的,並且正在使用2種技術的組合:
通過將該方法設為私有,非友元類不能調用此方法。 因此,任何試圖調用此代碼的代碼都將導致編譯錯誤。
在實踐中,該類仍然可以自我復制。 因此,此方法未實現,您將收到鏈接器錯誤。
從boost::noncopyable
繼承將阻止第二個用例,但是,它也會阻止編譯器生成有效的默認復制構造函數......因為它們將違反先前的約束。
請注意,如果您確實需要,可以通過調用這些“不可復制”類的常規構造函數來為繼承類編寫復制構造函數。
對於你的第二個問題:是的,你可以給它任何你想要的返回類型,盡管你不能寫a = b = c;
了。
1)構造對象時,還必須構造所有成員對象和基礎對象。 由於noncopyable::noncopyable(const noncopyable &)
是私有的,因此不能復制構造noncopyable
。 因此,任何包含它作為成員或基礎的對象也不能復制構造。
2)您可以通過您描述的三種方式中的任何一種聲明賦值運算符。 不,他們不是“同一件事”。 一個返回一個可變引用,一個返回一個const引用,一個返回void。 如果您嘗試操作賦值運算符的結果,則差異將很明顯。 考慮這個程序片段:
a = b;
(a = b).foo()
第一行將與任何賦值運算符一樣運行。 第二行將根據您使用的賦值運算符而有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.