Почему std::is_aggregate<T> является агрегатом?

У меня всегда сложилось впечатление, что такие типы, как std::is_same, std::is_void или std::is_aggregate, должны наследоваться от std::integral_constant или, точнее, от std::bool_constant.

Однако агрегатные классы не должны иметь базового класса по определению, но когда я использую эти типы как T в std::is_aggregate_v<T>, я получаю true. Получается, что они нет произошли от std::bool_constant?

Итак, мой вопрос:

Почему std::is_aggregate_v<std::is_aggregate<void>> верно, по крайней мере, для GCC и Clang? Разве в стандарте не указано, что std::is_aggregate происходит от std::bool_constant? Если нет, означает ли это, что он оставляет значение строки выше в качестве детали реализации?

en.cppreference.com/w/cpp/language/aggregate_initialization Невиртуальные общедоступные базовые классы разрешены в C++17.
KABoissonneault 23.04.2019 16:05

Прокрутите вниз страницу, на которую вы ссылаетесь; прочитайте страницу все ;)

Lightness Races in Orbit 23.04.2019 16:10

Да, не понял, что связанный текст продолжается по нескольким ответам;)

x432ph 23.04.2019 16:20

@ x432ph Обычно рекомендуется читать все (или, по крайней мере, большинство) ответов на странице; есть причина, по которой у нас есть модель вопросов и ответов «один ко многим»!

Lightness Races in Orbit 23.04.2019 16:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
4
895
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

However, aggregate classes must not have a base class by definition

Это уже не так. [dcl.init.aggr]/1 определяет агрегат как

An aggregate is an array or a class with

  • no user-provided, explicit, or inherited constructors ([class.ctor]),

  • no private or protected non-static data members (Clause [class.access]),

  • no virtual functions, and

  • no virtual, private, or protected base classes ([class.mi]).

[ Note: Aggregate initialization does not allow accessing protected and private base class' members or constructors.  — end note ]

Больше нет условия, что у него нет базового класса, как это было в C++14 и более ранних версиях. Пока у него есть общедоступный, не виртуальный базовый класс, который теперь разрешен. Это означает, что признаки типа теперь считаются агрегатами, пока для них выполняется указанное выше.

И std::is_aggregate является новым в C++ 17, поэтому OP должен будет использовать его ?

Lightness Races in Orbit 23.04.2019 16:10
Соответствующая ссылка на источник OP (не все прочитали)
Lightness Races in Orbit 23.04.2019 16:11

@LightnessRacesinOrbit О, круто. Я собирался написать комментарий к верхнему ответу, чтобы его отредактировать, но если есть конкретный ответ на С++ 17, я просто добавлю на него ссылку, чтобы было легче увидеть, что произошли изменения.

NathanOliver 23.04.2019 16:12

Да, есть ответы для всех опубликованных до сих пор стандартов - в идеале OP там должен повторно принять

Lightness Races in Orbit 23.04.2019 16:13

@LightnessRacesinOrbit Я обновил основной ответ, чтобы указать на них, чтобы сделать его более очевидным.

NathanOliver 23.04.2019 16:18

Вкусный! Спасибо.

Lightness Races in Orbit 23.04.2019 16:21

Начиная с C++17, классы с не виртуальными, не частными или защищенными базами являются агрегатами: https://en.cppreference.com/w/cpp/language/aggregate_initialization

Другие вопросы по теме