Форма ({1, 2, 3})
вызывает конструкторы vector<int>
напрямую и передает в качестве первого аргумента {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}
, точное значение зависит от класса.vector<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 }
), это приведет к ошибке.