Является ли массив любого типа всегда агрегированным?

class A 
{
public:
    A(){}

private:
    int i;
};

A a[8];

В стандарте С++ 11 8.5.1.1 говорится:

"Агрегат - это массив или класс (раздел 9) без конструкторов, предоставляемых пользователем (12.1), без привязки или выравнивания для нестатических элементов данных (9.2), без частных или защищенных нестатических данных (раздел 11), нет базовых классов (раздел 10) и нет виртуальных функций (10.3).

Как a является массивом, является агрегатом? Я думаю, что нет, но стандарт говорит "да".

Ответ 1

Да, A[8] является агрегированным типом, хотя A не является.

Понятие агрегата не является транзитивным, в отличие от некоторых других связанных понятий (например, "тривиально скопируемых" ).

Говоря кратко, совокупность влияет только на инициализацию типа и, следовательно, не обязательно должна быть транзитивной. Вы можете сказать A a[2] = { A('x', true), A(1, 2, 3) }; без необходимости устанавливать ограничения на характер A. Напротив, такие понятия, как тривиальная копируемость, относятся к макету памяти классов и, следовательно, по самой своей природе должны быть транзитивными.