いつ、なぜコンストラクタを明示的に削除したいのですか?理由がその使用を防ぐためであると仮定して、なぜそれを作ってみませんprivateか?
class Foo
{
public:
Foo() = delete;
};
いつ、なぜコンストラクタを明示的に削除したいのですか?理由がその使用を防ぐためであると仮定して、なぜそれを作ってみませんprivateか?
class Foo
{
public:
Foo() = delete;
};
delete。質問とルチアンの答えはどちらも、建設的であると簡単に言えます。C ++ 11の細かい点に気を配っていない人は、すぐに両方から何かを得る必要があります。
回答:
どうですか:
//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クラスのコンストラクターを呼び出すことは正当です。これは、削除されたコンストラクターには適用されません。
サンプルはこちら。
なぜコンストラクタを明示的に削除するのですか?
別の理由:クラスがイニシャライザで呼び出されることを保証したい場合
に使用deleteします。ランタイムチェックなしでこれを実現する非常にエレガントな方法だと思います。
C ++コンパイラはこのチェックを行います。
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
これ- 非常に簡略化された -コードは、次のようなインスタンス化がないことを保証します。Foo foo;
Foo、多くのコンストラクタだけではない、デフォルトのものを持っていたし、Foo foo;それが一致しなかったすべての暗黙のうちに、定義された保護およびプライベートコンストラクタをリストはるかに長いエラーが発生します。
LLVMのソースコード(たとえばAlignOf.h)で「削除済み」として宣言されたデフォルトのctorに遭遇しました。関連するクラステンプレートは通常、「llvm :: detail」と呼ばれる特別な名前空間にあります。そこでの全体的な目的は、彼らがそのクラスをヘルパークラスとしてのみ見なすことだったと思います。彼らはそれらをインスタンス化するつもりはありませんでした。コンパイル時に実行されるいくつかのメタプログラミングトリックを備えた他のクラステンプレートのコンテキスト内でのみ使用します。
例えば。sizeof(。)演算子のパラメーターとしてAlignOfと呼ばれる別のクラステンプレート内でのみ使用されるこのAlignmentCalcImplクラステンプレートがあります。その式はコンパイル時に評価できます。テンプレートをインスタンス化する必要はありません->それで、この意図を表すためにデフォルトのctor削除を宣言しないでください。
しかし、それは私の仮定にすぎません。
= defaultにもクラスがそれを使用することができ、私は個人的に見て好みではない、削除された機能の使用を。以上の機能はプライベートです。前者は「これは使用することを意図していない」と明確に述べています。それから何かが出てきた場合、それを使用できないクラスは実際に意味上の違いを作ります。