最近、明示的なデフォルトコンストラクターを必要とするC++0xのクラスに気づきました。ただし、デフォルトのコンストラクターを暗黙的に呼び出すことができるシナリオを思い付くことができません。それはかなり無意味な指定子のようです。Class c;
多分それは賛成することを許さないだろうと思っClass c = Class();
たが、そうではないようだ。
C ++ 0x FCDからのいくつかの関連する引用は、ナビゲートしやすいためです[同じ場所にない場合でも、同様のテキストがC++03に存在します]
12.3.1.3 [class.conv.ctor]
デフォルトのコンストラクターは、明示的なコンストラクターの場合があります。このようなコンストラクターは、デフォルトの初期化または値の初期化(8.5)を実行するために使用されます。
明示的なデフォルトコンストラクターの例を引き続き提供しますが、上記で提供した例を模倣しているだけです。
8.5.6 [decl.init]
デフォルトで-タイプTのオブジェクトを初期化するということは、次のことを意味します。
— Tが(おそらくcv修飾された)クラスタイプの場合(第9節)、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります)。
8.5.7 [decl.init]
タイプTのオブジェクトを値初期化するということは、次のことを意味します。
— Tがユーザー提供のコンストラクター(12.1)を持つ(おそらくcv修飾された)クラスタイプ(条項9)の場合、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります) );
どちらの場合も、標準ではデフォルトのコンストラクターが呼び出される必要があります。しかし、それは、デフォルトのコンストラクターが非明示的である場合に起こることです。完全を期すために:
8.5.11 [decl.init]
オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。
私の知る限り、これはデータなしからの変換を残すだけです。これは意味がありません。私が思いつくことができる最高のものは次のとおりです。
void function(Class c);
int main() {
function(); //implicitly convert from no parameter to a single parameter
}
しかし、明らかにそれはC++がデフォルトの引数を処理する方法ではありません。他に何がexplicit Class();
違う振る舞いをするのでしょうClass();
か?
この質問を生成した特定の例は、std::function
[20.8.14.2func.wrap.func]でした。いくつかの変換コンストラクターが必要であり、いずれも明示的にマークされていませんが、デフォルトのコンストラクターはです。