2017-09-19 6 views
8

括弧の中にイニシャライザーリストをラッピングすると、どのような影響がありますか?それは単にリストの初期化のための別の形式ですか、それとも特定のシナリオでのみ機能しますか?括弧の中にイニシャライザのリストをラップすると、どのような影響がありますか?

例えば、aを考慮してください。

struct A { 
    A(float a, float b) {} 
}; 

int main() 
{ 
    A b(1.0f, 0.0f); // Direct initalization, finds ctor for (float, float) 
    A c{1.0f, 0.0f}; // List initalization, finds a matching ctor 

    A a({1.0f, 0.0f}); // Is this list initalization... which is expanded? 
} 

答えて

10

A a(something)somethingからaを構築すると言います。したがって、something{1.0f, 0.0f}に置き換えた場合、パラメータメーターを{1.0f, 0.0f}で初期化できるコンストラクターを見つける必要があります。私たちが持っている唯一のコンストラクタは、デフォルトのコピーコンストラクタとムーブコンストラクタで、それぞれconst A&A&&です。だから、

A a({1.0f, 0.0f}); 

を行うと、実際に一時的Aを作成し、aを初期化すること、一時的に使用されます。この場合、オブジェクトは移動可能であり、rvaluesを処理するときにはコンストラクタをコピーするために移動コンストラクタが優先されるため、移動コンストラクタが使用されます。

+0

これらの暗黙のコンストラクタは、慣れるまでに時間がかかります。ありがとう! – Raginator

+0

@Raginator問題はありません。私はちょうど移動のセマンティクスを含めるように答えを更新しました。この場合、コピーコンストラクターの代わりに移動コンストラクターが使用されます。 – NathanOliver

+3

技術的には正しくありますが、移動コンストラクタまたはコピーコンストラクタは呼び出されません(C++の必須のコピーエリートでさえも)。 C++ 14ではこれらのコンストラクタはまだアクセス可能でなければならず、C++でも削除することさえできます。 – Jodocus

関連する問題