2011-07-28 10 views
7

ブーストから派生したクラスから派生したクラスでコピーが自動的に禁止されていますか?たとえば

class Foo : boost::noncopyable 
{ 
    // ... 
}; 

class Bar : public Foo 
{ 
    // ... 
}; 

Bar非コピー可能ですか?

+0

1コピー不可です。答えは少し分かりやすいと私は考えていません。 :) –

+0

それが明らかになる前に私はちょっと考えなければなりませんでした。誰もこの質問をしたことはないと私は驚いた。 –

答えて

8

デフォルトでは、コピーコンストラクタを作成しない限りそこに基本コピーコンストラクタを呼び出すことは避けてください。

また、C++ 11で導入されたExplicitly-defaulted and deleted special member functionsも参照してください。コピーコンストラクタ/演算子をプライベートにすることで問題が解決されたとしても、コンパイラは診断メッセージを生成します。このメッセージはかなり明確ではないので、この問題を解決するためにC++ 11には削除されたコピーコンストラクタ/演算子があります。

+1

。そして、それはほぼ確実に「壊れている」でしょう。 –

+0

@Tomalak:はい:-)しかし、まだ可能です、hehe。 –

2

派生クラスにはコピー不可能なコピーコンストラクタの呼び出しを避けるカスタムコピーコンストラクタがないと仮定します。すべてのレベルで、boost::noncopyableの派生クラスはすべてコピーできません。派生クラスのオブジェクトにはboost::noncopyableのサブオブジェクトも含まれているため、派生クラスはコピー可能なベースクラスなしでコピー可能であることを意味しません。

1

Barboost::noncopyable(それが直接継承ではないにもかかわらず)から派生しています。これは非常によく形成問題であるため、

1

それはコピー可能だった場合は、[はい、すべての基底クラスがコピー可能である必要がありますが、後押し::コピー不可は

+0

"コピー可能な場合、すべての派生クラスはコピー可能でなければなりません" - そうではありません。 'struct Bar:struct Foo、boost :: noncopyable {};'を考えてみましょう。 'Foo'はコピー可能ですが、' Bar'はコピーできません。 –

+1

@Tomalak:はい、私は 'base'と' derived'を混在させました - 今修正されました – ks1322

関連する問題