Странные результаты агрегатной инициализации и декомпозицииC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Странные результаты агрегатной инициализации и декомпозиции

Сообщение Anonymous »

Это вопрос, состоящий из двух частей: один об инициализации агрегата, а другой о декомпозиции.
У меня есть функция ниже, выполняющая подсчет элементов агрегата (если вам нужна дополнительная информация, посмотрите здесь)

Код: Выделить всё

namespace detail
{
struct filler_t { template constexpr operator T() { return {}; } };
template concept aggregate_type = std::is_aggregate_v;
}
//-------------------------------------------------------------------------
// return member count of an aggregate
template
constexpr auto aggregate_member_count(auto&& ...filler)
{
if constexpr (requires{ T{ filler... }; })
return aggregate_member_count(detail::filler_t{}, filler...);
else
return sizeof...(filler) - 1;
}
Я указываю соответствие компиляторам C++23. Это работает, как и ожидалось, при подсчете членов простого агрегата, но дает неожиданный результат для агрегата, имеющего базовый класс. В приведенном ниже примере для класса A выводится «3», как и ожидалось, но для класса B выводится «2». Почему это? Вы можете инициализировать B с помощью 4 инициализаторов.

Код: Выделить всё

    struct A { int a; unsigned b; double c; } sa{1,2,3.};
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78679882/strange-results-of-aggregate-initialization-and-decomposition[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»