Формы инициализации списка
Смотрите следующий код:
std::vector<int> v1{1, 2, 3};
std::vector<int> v2 = {1, 2, 3};
Мои вопросы:
Есть ли разница между ними? Я знаю, что первая должна быть инициализация списка, но как насчет второй?
Поскольку есть знак присваивания для второго, это заставляет меня думать, что компилятор будет использовать
std::initializer_list
создать временныйvector
сначала, затем он использует конструктор копирования, чтобы скопировать временныйvector
вv2
, Это факт?
2 ответа
Два ( прямая инициализация списка по сравнению с инициализацией копирования списка) в этом случае абсолютно одинаковы. Нет временных std::vector
построен и нет std::vector::operator=
называется. Знак равенства является частью синтаксиса инициализации.
Там будет разница, если std::vector
Перегрузки конструктора нет. 7 был отмечен explicit
, в этом случае любая инициализация копирования завершится неудачно, но это будет недостатком в дизайне стандартной библиотеки.
Они оба инициализируют список (начиная с C++11). Первый из них - прямая инициализация списка, а второй - инициализация копирования списка.
- Есть ли разница между этими двумя?
Для прямой инициализации списка будут рассмотрены как явные, так и неявные конструкторы, тогда как инициализация копирования списка может быть вызвана только неявными конструкторами. Для этого случая (т.е. std::vector
) фактический результат такой же.
- Поскольку есть знак присваивания для второго, это заставляет меня думать, что компилятор сначала будет использовать initializer_list для создания временного вектора, затем он использует конструктор копирования для копирования временного вектора в v2. Это факт?
Нет. Даже для инициализации copy-list-объекта объект будет создан соответствующим конструктором напрямую. Для этого случая временный std::initializer_list<int>
будет создан, а затем std::vector::vector(std::initializer_list<T>, const Allocator& = Allocator())
будет призван построить v2
,