112

いつ/なぜコンストラクターを明示的に削除したいのですか? その理由がその使用を防ぐことであると仮定すると、なぜそれを作らないのprivateですか?

class Foo
{ 
  public: 
    Foo() = delete; 
};
4

3 に答える 3

105

どうですか:

//deleted constructor
class Foo
{ 
  public: 
    Foo() = delete;     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //illegal
}

//private constructor
class Foo
{ 
  private: 
    Foo() {}     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //legal
}

それらは基本的に異なるものです。privateクラスのメンバーのみがそのメソッドを呼び出したり、その変数 (またはもちろん友人) にアクセスしたりできることを示しています。この場合、staticそのクラス (または他のメンバー) のメソッドがクラスのprivateコンストラクターを呼び出すことは正当です。これは、削除されたコンストラクターには当てはまりません。

サンプルはこちら

于 2012-12-01T00:06:57.557 に答える
2

LLVM のソース コード (たとえば、AlignOf.h) で「削除済み」として宣言されているデフォルトの ctor に遭遇しました。関連するクラス テンプレートは、通常、'llvm::detail' と呼ばれる特別な名前空間にあります。そこの全体的な目的は、彼らがそのクラスをヘルパークラスとしてのみ考えたことだったと思います。インスタンス化するつもりはありませんでした。コンパイル時に実行されるいくつかのメタプログラミングのトリックを使用して、他のクラス テンプレートのコンテキスト内でそれらを使用するだけです。

例えば。sizeof(.) 演算子のパラメーターとして AlignOf と呼ばれる別のクラス テンプレート内でのみ使用される、この AlignmentCalcImpl クラス テンプレートがあります。その式はコンパイル時に評価できます。テンプレートをインスタンス化する必要はありません->したがって、デフォルトのctor deleteを宣言して、この意図を表現してみませんか。

しかし、それは私の仮定にすぎません。

于 2016-10-26T08:31:49.160 に答える