Какая разница в инициализации вектора

Я читал кое-что о списке инициализации С++ 11, инициализации униформы и некоторых других. Но я все еще немного путаюсь в их различии. Пожалуйста, проверьте ниже и в чем разница между ними. Спасибо!

std::vector<int> a1({1, 2, 3, 4});
// this is initialize list a object, then copy-constructor? 

std::vector<int> a2{1, 2, 3, 4};
// this is initialize list

std::vector<int> a2{{1, 2, 3, 4}};
// what is this?

person Jerry YY Rain    schedule 26.05.2014    source источник
comment
Не могли бы вы уточнить, что, по вашему мнению, вы понимаете, а что не имеет для вас смысла? Без подробностей любой ответ будет выглядеть точно так же, как и все остальное, что вы уже прочитали. И если они вам не помогли, вероятно, любые общие ответы также не помогут вам. Поэтому для полезного ответа вам нужно лучше описать свои трудности.   -  person sth    schedule 26.05.2014


Ответы (1)


std::vector<int> a1({1, 2, 3, 4});

std::vector<int> a2{1, 2, 3, 4};

std::vector<int> a2{{1, 2, 3, 4}};

Все 3 строки делают одно и то же:

Компилятор создает std::initializer_list<int>, а затем передает его конструктору std::vector<int>, который принимает std::initializer_list<int>.

person Drax    schedule 27.05.2014
comment
Я думаю, вопрос в том, происходит ли создание копии, когда временный initializer_list передается конструктору vector. Думаю, в данном случае это ход. - person isarandi; 27.05.2014
comment
@isarandi Хорошо, поскольку std::initializer_list не владеет своим содержимым, и, как сказано на соответствующей странице cppreference это может быть реализовано как пара указателей или указателя и длины, перемещение и копирование std::initializer_list, скорее всего, являются одной и той же операцией (несколько назначений указателя/целого числа). - person Drax; 27.05.2014