Spec-Zone.ru › C++

std::meta::size_of

Определено в заголовочном файле <meta>
consteval std::size_t size_of( std::meta::info r );
(начиная с C++26)

Возвращает размер типа или объекта (подобъекта), представленного r.

Параметры

r - значение отражения

Возвращаемое значение

Если r представляет тип «ссылка на T», возвращает sizeof(T*).

В противном случае, если r представляет тип U, возвращает sizeof(U).

В противном случае эквивалентно std::meta::size_of(std::meta::type_of(r)).

Исключения

Выбрасывает std::meta::exception, если не выполняются все следующие условия:

  • std::meta::dealias(r) представляет одно из следующего:
    • тип
    • объект
    • значение (скалярного типа)
    • переменную нереференсного типа
    • нестатический член данных, не являющийся битовым полем
    • отношение прямого базового класса
    • описание члена данных, ширина битового поля которого равна ⊥
  • Если std::meta::dealias(r) представляет тип, std::meta::is_complete_type(r) равно true.

Примечания

Эта функция рассматривает «ссылку на T» так же, как «указатель на T». Это соответствует представлению нестатических членов-ссылок.

Результат отличен от нуля, даже если r представляет отношение прямого базового класса для пустого базового класса.

Пример

#include <meta>

static_assert(std::meta::size_of(^^int) == sizeof(int));
static_assert(std::meta::size_of(^^int*) == sizeof(int*));

consteval bool test()
{
    struct A; 
    // constexpr auto _ = std::meta::size_of(^^A);
        // error: uncaught exception of type 'std::meta::exception';
        // 'what()': 'reflection with incomplete type in size_of'
    return true;
}
static_assert(test());

struct B { int i, j; };
static_assert(sizeof(B) == std::meta::size_of(^^B));

template<class T>
struct C { T m; };
static_assert(size_of(^^C<char>) == sizeof(char));

struct D { int x : 015; };
static_assert(size_of(^^D) == sizeof(int));

// static_assert(size_of(^^D::x) == sizeof(int));
    // error: uncaught exception of type 'std::meta::exception';
    // 'what()': 'reflection not suitable for size_of'

int main() {}

См. также

alignment_of
(C++26)
возвращает выравнивание отражённого объекта или типа
(функция)
bit_size_of
(C++26)
возвращает размер отражённого объекта или типа в битах
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/size_of

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API