Агрегированная инициализация класса, который в частном порядке наследует агрегатный класс в C ++ 11

Рассмотрим следующий код:

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 через агрегатную инициализацию?

1

Решение

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,

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]