2013-04-07 11 views
5

これは不可能だと思いますが、私はよく尋ねるかもしれません。 プライベートコピーコンストラクタを宣言しても、デフォルト実装を使用できますか?コピーコンストラクタをprivateにしても、デフォルトの実装をそのまま使用することはできますか

背景:私は非常に大きなベクトルを持つクラスを持っており、1つのメンバ関数を除いてコピーコンストラクタを呼びたくありません。 のような標準的な公開コピーを使用すると、簡単にたとえば次のようなバグにつながる可能性があります。 foreach(Type const& el,vectOfBigObjects)の代わりに反復(foreach(Type el,vectOfBigObjects)の参照を忘れてしまった。したがって、私は標準的なコピーコンストラクターを保ちたいが、それを非公開にしたい。

copy-ctors定義を書き換えないとこれは可能ですか?

答えて

11

copy-ctors定義を書き換えないと可能ですか?

C++ 11では、はい。あなただけのコンストラクタを宣言し、をデフォルト設定としてマークする必要があります。

struct X 
{ 
    // ... 
private: 
    X(X const&) = default; 
}; 

これは、暗黙的に生成されたものと同じ定義を持つことになり、コピーコンストラクタを定義しますが、privateになります。たとえば、

struct X 
{ 
    X() { } // Required because a user-declared constructor in 
      // the definition of X inhibits the implicit generation 
      // of a default constructor (even if the definition is 
      // defaulted!) 

    void foo() 
    { 
     // ... 
     X tmp = *this; // OK! 
     // ... 
    } 

private: 

    X(X const&) = default; // Default definition, accessible to 
          // member functions of X only! 
}; 

int main() 
{ 
    X x; 
    // X x2 = x; // ERROR if uncommented! 
} 

ここにはlive exampleがあります。クラス定義のユーザーが宣言したコンストラクタ(コピーコンストラクタを含む)は、その定義がデフォルトになっていても、デフォルトコンストラクタの暗黙的な生成を禁止していることに注意してください。これは、たとえば、私が上記の例でXのデフォルトのコンストラクタを明示的に宣言しなければならなかった理由です。

関連する問題