У меня всегда сложилось впечатление, что такие типы, как 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? Если нет, означает ли это, что он оставляет значение строки выше в качестве детали реализации?
Прокрутите вниз страницу, на которую вы ссылаетесь; прочитайте страницу все ;)
Да, не понял, что связанный текст продолжается по нескольким ответам;)
@ x432ph Обычно рекомендуется читать все (или, по крайней мере, большинство) ответов на странице; есть причина, по которой у нас есть модель вопросов и ответов «один ко многим»!





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 должен будет использовать его ?
@LightnessRacesinOrbit О, круто. Я собирался написать комментарий к верхнему ответу, чтобы его отредактировать, но если есть конкретный ответ на С++ 17, я просто добавлю на него ссылку, чтобы было легче увидеть, что произошли изменения.
Да, есть ответы для всех опубликованных до сих пор стандартов - в идеале OP там должен повторно принять
@LightnessRacesinOrbit Я обновил основной ответ, чтобы указать на них, чтобы сделать его более очевидным.
Вкусный! Спасибо.
Начиная с C++17, классы с не виртуальными, не частными или защищенными базами являются агрегатами: https://en.cppreference.com/w/cpp/language/aggregate_initialization