Рассмотрим следующий код:
struct base
{
int x, y, z;
};
struct derived : private base
{
using base::base;
};
int main(int argc, const char *argv[])
{
base b{1, 2, 3}; // Allowed
derived d{1, 2, 3}; // Not allowed
}
Линия derived d{1, 2, 3};
заставляет мой компилятор (Clang 3.3) завершиться с ошибкой «нет подходящего конструктора для инициализации« производного »». Почему это? Есть ли способ инициализировать derived
через агрегатную инициализацию?
derived
имеет базовый класс, поэтому он не является агрегатом (§8.5.1 / 1: «Агрегат — это массив или класс (раздел 9) без […] базовых классов […]»).
Поскольку это не агрегат, его нельзя инициализировать с помощью агрегатной инициализации.
Наиболее очевидный обходной путь, вероятно, будет добавить ctor
основать, и иметь ктор для derived
передать аргументы base
:
struct base
{
int x, y, z;
base(int x, int y, int z) : x(x), y(y), z(z) {}
};
struct derived : private base
{
derived(int a, int b, int c) : base(a, b, c) {}
};
int main(int argc, const char *argv[])
{
base b{1, 2, 3}; // Allowed
derived d{1, 2, 3}; // Allowed
}
Конечно, это не сработает, если вы настроены на base
оставаясь совокупностью.
Изменить: Для отредактированного вопроса я не вижу способа использовать std::initializer_list
Вот — std::array
не имеет ничего, чтобы принять initializer_list
,
Других решений пока нет …