2015-11-07 10 views
6

デフォルトのユーザー定義コンストラクタデフォルトの(ユーザー定義の)コンストラクタとコンストラクタの違いは何ですか?

class Simple 
{ 
public: 
    Simple() {} 
}; 

と複数の引数を取るだけでなく、WithDefaultsができること以外のこれら

class WithDefaults 
{ 
public: 
    WithDefaults(int i = 1) {} 
}; 

のそれぞれについて、デフォルト値を持っているユーザー定義コンストラクタの間に違いがありますiの明示的な値で構成されていますか?

具体的に言えば、これらの2つのコンストラクタが両方のデフォルトコンストラクタを同じロールで使用しているのか、クラスのプロパティ間に微妙な違いがあるのか​​、

つまり、すべての引数のデフォルト値をすべての方法でデフォルトコンストラクタに持つコンストラクタですか?

+0

私はこれが重複していると予想していましたが、実際はどこでもこの回答が見つかりませんでした。 – MicroVirus

+0

[C++コンストラクタのデフォルトパラメータ](* http://stackoverflow.com/questions/187640/default-parameters-with-c-constructors)で*ほぼ*回答していますが、わかりません。 – MicroVirus

+1

孤立して、私はクラスは同じだと思います。コンバージョンを考慮した場合、彼らは異なる行動をとることができます。 @MicorVirusの2番目のコメントのリンクはこれをさらに説明しています。 –

答えて

6

現在の標準的な作業草案N4527 [12.1p4]:

クラスXためデフォルトコンストラクタがパラメータまたは他の ない各パラメータを持っていないのいずれかのクラスX のコンストラクタですfunction parameter packにはデフォルトの引数があります。 [...]

したがって、2番目のクラスのコンストラクタは完全に有効なデフォルトのコンストラクタです。


C++ 11と14の出版されたバージョンでの文言は若干異なっていたが、あなたの質問の違いを確認しないことだけ注意してください。クラスXため

デフォルトコンストラクタが引数なしで呼び出すことができるクラスX のコンストラクタです:それはあるために使用されます。

デフォルトの初期化のセマンティクスを明確にするために、現在の文言の変更はDR 1630の結果として行われました。以前は、標準では "デフォルトコンストラクタ"を参照する場所がありました。現在の表現は、SFINAEを使用するなど、いくつかのコンストラクタを潜在的に持つことができる、より複雑なシナリオをサポートすることを意図しており、使用されるものは通常の過負荷解決を使用して選択されます。

+0

ABIとの互換性を考慮すると少し差があります。 – Deduplicator

+1

@Deduplicator良い点ですが、一般的なステートメントに当てはまると思います。「すべてのパラメータのデフォルトの引数を持つ関数は、何も持たない構文と同じ構文で呼び出すことができますが、2つの意味はありません関数には同じシグネチャがあります "。 – bogdan

関連する問題