Я играл с C++ 11 в течение последних нескольких дней, и я придумал что-то странное.Почему 'std :: vector <int> b {2};' создать 1-элементный вектор, а не 2-элементный?
Если я хочу, чтобы равномерно инициализировать INT:
int a{5};
Но если бы я сделать то же самое в станд :: вектор:
std::vector<int> b{2};
Не построить массив два элемента, но скорее массив с одним элементом значения два. Похоже, что, чтобы получить этот эффект можно было бы нужно быть более четко об этом
:std::vector<int> c{{2}};
std::vector<int> d = {2};
Но не так, как заявление о б - это, кажется непоследовательным. Я видел некоторые другие вещи с тем же эффектом. То, о чем я прошу, - это такое поведение в последнем стандарте C++ 11, или это только в проекте, который был реализован раньше? Если да, то почему комитет по стандартам включил это поведение? Похоже, что он побеждает всю цель равномерной инициализации, так как нужно помнить, какие классы имеют конструкторы списка инициализаторов, и использовать синтаксис old() вместо {} только с этими классами. Или же вообще не выполняется равномерная инициализация.
Это похоже на большую «гочу». Но может быть и преимуществ, о которых я не знаю.
Edit: этот код:
#include <iostream>
#include <vector>
int main() {
std::vector<int> a{2};
for (auto x: a) {
std::cout << x << std::endl;
}
return 0;
}
выходы "2" на GCC 4.6.2
@ildjarn: Я могу подтвердить это на gcc, и поскольку он имеет список инициализаторов ctor, кажется, что это правильно. – PlasmaHH
Обратите внимание, что (ложное) обещание равномерной инициализации не означает, что вы можете повсюду заменить() на {}, только что вы теперь можете использовать {} в гораздо большем количестве мест. – PlasmaHH
Я не эксперт C++ 11, но я просто взял на него учебный класс, и это выглядит правильно для меня. – Almo