Это разрешено в стандарте:
struct A
{
int a = 3;
int b = 3;
};
A a{0,1}; // ???
Этот класс все еще агрегирован?
clang
принимает этот код, но gcc
не делает.
В C ++ 11 наличие инициализаторов членов класса делает структуру / класс не агрегатной, однако в C ++ 14 это изменилось. Это то, что мне показалось удивительным, когда я впервые столкнулся с этим, обоснование этого ограничения состоит в том, что инициализаторы в классе очень похожи на определяемый пользователем конструктор, но контраргумент состоит в том, что никто не ожидает, что добавление инициализаторов в классе должно сделать их класс / структура не агрегатные, я уверен, что нет.
От проект стандарта C ++ 11 раздел 8.5.1
сводные показатели (Акцент шахты идет вперед):
Агрегат — это массив или класс (раздел 9) без предоставления пользователем
конструкторы (12.1), нет скобок или равных инициализаторов для нестатических
члены данных (9.2), нет частных или защищенных нестатических элементов данных
(Раздел 11), без базовых классов (раздел 10) и без виртуальных функций
(10.3).
И в C ++ 14 тот же абзац гласит:
Агрегат — это массив или класс (раздел 9) без предоставления пользователем
конструкторы (12.1), нет частных или защищенных нестатических элементов данных
(Раздел 11), без базовых классов (раздел 10) и без виртуальных функций
(10.3).
Это изменение покрыто N3605: члены инициализаторы и агрегаты который имеет следующее резюме:
Бьярн Страуструп и Ричард Смит подняли вопрос об совокупности
инициализация и члены-инициализаторы не работают вместе. это
бумага предлагает решить проблему путем принятия предложенной Смитом формулировки
это снимает ограничение, которое агрегаты не могут иметь
член-инициализаторы.
Этот комментарий в основном подводит итог нежеланию позволить им быть совокупностями:
Агрегаты не могут иметь пользовательских конструкторов и
члены-инициализаторы по сути своего рода пользовательские
конструктор (элемент) (см. также основной дефект 886). Я не против этого
расширение, но это также имеет последствия для того, что наша модель
агрегаты на самом деле есть. После принятия этого продления я мог бы
хотел бы знать, как научить, что такое агрегат.
Пересмотренная версия N3653 был принят в Май 2013.
Обновить
EMSR указывает, что G ++ 5.0 теперь поддерживает агрегаты C ++ 14 с нестатическими инициализаторами элементов данных используя либо std=c++1y
или же -std=c++14
:
struct A { int i, j = i; };
A a = { 42 }; // a.j is also 42
Увидеть это работает жить.