Формы инициализации списка

Смотрите следующий код:

std::vector<int> v1{1, 2, 3};
std::vector<int> v2 = {1, 2, 3};

Мои вопросы:

  1. Есть ли разница между ними? Я знаю, что первая должна быть инициализация списка, но как насчет второй?

  2. Поскольку есть знак присваивания для второго, это заставляет меня думать, что компилятор будет использовать std::initializer_list создать временный vector сначала, затем он использует конструктор копирования, чтобы скопировать временный vector в v2, Это факт?

2 ответа

Решение

Два ( прямая инициализация списка по сравнению с инициализацией копирования списка) в этом случае абсолютно одинаковы. Нет временных std::vector построен и нет std::vector::operator= называется. Знак равенства является частью синтаксиса инициализации.

Там будет разница, если std::vector Перегрузки конструктора нет. 7 был отмечен explicit, в этом случае любая инициализация копирования завершится неудачно, но это будет недостатком в дизайне стандартной библиотеки.

Они оба инициализируют список (начиная с C++11). Первый из них - прямая инициализация списка, а второй - инициализация копирования списка.

  1. Есть ли разница между этими двумя?

Для прямой инициализации списка будут рассмотрены как явные, так и неявные конструкторы, тогда как инициализация копирования списка может быть вызвана только неявными конструкторами. Для этого случая (т.е. std::vector) фактический результат такой же.

  1. Поскольку есть знак присваивания для второго, это заставляет меня думать, что компилятор сначала будет использовать initializer_list для создания временного вектора, затем он использует конструктор копирования для копирования временного вектора в v2. Это факт?

Нет. Даже для инициализации copy-list-объекта объект будет создан соответствующим конструктором напрямую. Для этого случая временный std::initializer_list<int> будет создан, а затем std::vector::vector(std::initializer_list<T>, const Allocator& = Allocator()) будет призван построить v2,

Другие вопросы по тегам