簡體   English   中英

boost :: noncopyable如何工作

[英]How does boost::noncopyable work

在我的C ++實踐中,我偶然發現了兩個愚蠢的問題:

  1. c ++拷貝構造函數和賦值運算符中的AFAIK不是繼承的......那么在這種情況下boost :: noncopyable如何幫助禁止這些東西呢?

    \n class X:private boost :: noncopyable\n {\n };\n
    是否有必要僅使用私有繼承來實現目標?

  2. 是否只有一種方法來聲明賦值運算符

    \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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM