({1, 2, 3})
フォームはのコンストラクターを直接呼び出し、最初vector<int>
の引数としてaを渡します{1, 2, 3}
。あなたはもっと多くの議論を渡すことができたでしょう
vector<int> vk({1, 2, 3}, myAllocator);
vector<int>
最初のパラメーターがまたは(別のコンテナークラスなど)initializer_list
によって初期化できる別のタイプのコンストラクターがない場合は、機能しません。{1, 2, 3}
あなたの場合vector<int>
、実際には最初のパラメーターが。であるコンストラクターがあるため、これは機能しますinitializer_list<int>
。これは通常の関数呼び出しと同じです
void f(vector<int> const& vk);
int main() { f({1, 2, 3}); }
のように括弧を省略した場合vector<int> vk{1, 2, 3}
、正確な意味はクラスによって異なります。Avector<int>
には、初期化子リストコンストラクターがあります。これは、タイプの最初のパラメーターinitializer_list<int>
(オプションでそれへの参照)を持つコンストラクターであり、他のすべてのパラメーターにはデフォルトの引数があります。クラスにそのようなコンストラクターがある場合、初期化子リストがそのコンストラクターに渡されます。あるいは、クラスは単純に集合体(たとえば、初期化子リストがメンバーを初期化する)にすることも、個別の引数struct A { int a; int b; int c; };
を受け入れるコンストラクターを持つこともできます。3
int
最後に、= { 1, 2, 3 }
形式は括弧を省略したバージョンとほぼ同じです(つまり、削除するだけです=
)。ただし、明示的なコンストラクターを使用することは禁止されています(つまり、明示的なコンストラクターとして宣言した場合、explicit vector(initializer_list<int>);
またはexplicit vector(int, int, int);
代わりに宣言した場合は、を使用するとエラーが発生します= { 1, 2, 3 }
) 。 。