Я играл с С++ 11 за последние несколько дней, и я придумал что-то странное.
Если я хочу равномерно инициализировать int:
int a{5};
Но если я сделаю то же самое с std::vector:
std::vector<int> b{2};
Не создает массив из двух элементов, а массив с одним элементом значения два. Похоже, чтобы получить этот эффект, нужно было бы более подробно говорить об этом:
std::vector<int> c{{2}};
std::vector<int> d = {2};
Но не так, как объявление b - это кажется непоследовательным. Я видел некоторые другие вещи с тем же эффектом. То, о чем я прошу, - это такое поведение в последнем стандарте С++ 11, или это только в проекте, который был реализован раньше? Если да, то почему комитет по стандартам включил это поведение? Похоже, что он побеждает всю цель равномерной инициализации, так как нужно помнить, какие классы имеют конструкторы списка инициализаторов, и использовать синтаксис old() вместо {} только с этими классами. Или вообще не выполняется равномерная инициализация.
Это похоже на большую "добычу". Но может быть и преимуществ, о которых я не знаю.
Изменить: этот код:
#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