Единая инициализация не означает, что вы думаете, что делает. Он был добавлен, чтобы сделать инициализацию более равномерной среди типов в C ++. Аргументация такова:
typedef struct dog_ {
float height;
int weight;
} dog;
int main() {
dog Spot = { 25.6, 45};
dog Data[3] = { Spot, {6.5, 7} };
std::array<dog, 2> data = { { Spot, {6.5, 7} } }; //only in C++ obviously
return 0;
}
Это действительный код C и C ++ , а уже много лет . Это было действительно удобно, но вы должны были помнить, что это работало только с типами POD. Люди долго жаловались, что нет способа сделать std::vector<int> data = { 3, 7, 4, 1, 8};
, но некоторые классы (std::array
) были написаны странным образом, чтобы позволить конструкторам списка инициализатора.
Итак, для C ++ 11 комитет сделал так, чтобы мы могли сделать так, чтобы vector и другие классные классы делали это тоже. Это сделало конструкцию всех типов более однородной, так что мы можем использовать {}
для инициализации через конструкторы, а также из списков значений. Проблема, с которой вы сталкиваетесь, заключается в том, что перегрузка конструктора с std::initializer_list<int>
является лучшим соответствием и будет выбрана первой. Таким образом, std::vector<int> b{2};
не означает вызов конструктора, который принимает int
, а означает создание vector
из этого списка int
значений. В этом свете вполне логично создать vector
, содержащее единственное значение 2
. Чтобы вызвать другой конструктор, вы должны будете использовать синтаксис ()
, чтобы C ++ знал, что вы не хотите инициализировать из списка.