Инициализация списка контейнеров пользовательских типов ведет себя не так, как я ожидал. См. этот фрагмент:
#include <array>
struct A {
char C;
int s;
};
int main(int argc, char * argv[]) {
A x = {'x'}, y = {'y'};
std::array<int, 2> i = {1, 2}; // Ok
std::array<A, 2> a = {x, y}; // Ok
//std::array<A, 2> b = { {'x',1000}, {'y',2000} }; // Error: too many initializers!!!
std::array<A, 2> c = { A{'x',1000}, A{'y',1000} };
std::array<A, 2> d = {{ {'x',1000}, {'y',1000} }}; // Ok!!
std::array<A, 2> e = {'x', 2000, 'y', 5000}; // Ok!!
}
Я могу инициализировать i
, как если бы это был фундаментальный массив. Я могу сделать то же самое с a, если они являются переменными. Но я не могу инициализировать b
без указания типа A
, например, в c
.
Чтобы инициализировать
std::array
без явного указания типаA
, я должен добавить еще одну пару фигурных скобок. Какова логика необходимости двойных фигурных скобок? Почему его нельзя инициализировать одной парой фигурных скобок вокруг списка, как вb
?Кроме того, на удивление
c
работает и дает только два объекта! Интуитивно я ожидал бы, чтоe
выдаст ошибку, потому что есть 4 начальных значения максимум для 2 объектов, но вместо этого компилятор правильно заполняет членыA
! Почему это происходит?