2

私はクラスを持っていますが、メンバーはまったくありません。したがって、インスタンス化することは意図されていません。そこで、デフォルトのc-rを削除しました。これは、リストの初期化以外の構成を禁止します。それを禁じる方法はありますか?空リストの初期化を禁止する方法は?

class Empty{ 
//No non-static data members 
Empty()=delete; 
}; 

Empty A{};// is allowed 
Empty A ={};//is allowed too 
//Empty A; ok, forbidden 
//Empty A=Empty(); ok, forbidden 

答えて

4

Empty A{};Emptyaggregateあるので、動作します。既定のコンストラクタを単に削除するだけでは、それが集約されないようにするには不十分です。

これを行う最も簡単な方法は、型のサイズが変更されないように、タイプcharのプライベートメンバーを与えることです。あるいは、= defaultではないプライベートのデフォルトのコンストラクタを与えることもできます。

しかし、タイプがオブジェクトを作るために使用されることを意図していないという理由だけでは、に特別な注意を払うべきではありません。を防止します。 std::enable_if<blah>もタイプであり、そのタイプのオブジェクトは構築されることを意図していません。しかし、あなたはまだそれを行うことができます。

本物のという問題がある場合を除き、これらの手順を実行しないでください。これは、ユーザーがその種類のオブジェクトを作成したことが原因です。

+0

もう1つの醜いハックは、ユーザーが提供するコンストラクタを追加することです。 '空(ダミー){}; private:struct dummy {}; ' –

関連する問題