Extensions for reflection
Расширения C++ для рефлексии, ISO/IEC TS 23619:2021, определяют модификации базового языка и вводят новые компоненты для стандартной библиотеки C++, перечисленные на этой странице.
Техническая спецификация Reflection основана на стандарте C++20 (за исключением того, что определения концепций заданы в стиле Concepts TS ).
Изменения в базовом языке
спецификатор reflexpr
Спецификатор reflexpr
имеет форму
reflexpr
(
операнда reflexpr
)
и задаёт тип метаобъекта (см. ниже).
reflexpr-operand может быть одним из следующих:
::
|
(1) | ||||||||
| type-id | (2) | ||||||||
| nested-name-specifier (optional) namespace-name | (3) | ||||||||
| id-expression | (4) | ||||||||
(
expression
)
|
(5) | ||||||||
| function-call-expression | (6) | ||||||||
| functional-type-conv-expression | (7) | ||||||||
где function-call-expression является
postfix-expression
(
expression-list
(необязательно)
)
|
|||||||||
и functional-type-conv-expression являются следующими видами выражений, которые выполняют явное приведение типа :
спецификатор-простого-типа
(
список-выражений
(необязательно)
)
|
(1) | ||||||||
спецификатор-typename
(
список-выражений
(необязательно)
)
|
(2) | ||||||||
| спецификатор-простого-типа список-инициализации-в-фигурных-скобках | (3) | ||||||||
| спецификатор-typename список-инициализации-в-фигурных-скобках | (4) | ||||||||
Операнд для reflexpr-спецификатора должен быть типом , пространством имён , перечислителем , переменной, членом данных , параметром функции , захваченной сущностью , function-call-expression или functional-type-conv-expression , а также выражением в скобках. reflexpr ( :: ) отражает глобальное пространство имён.
Для
reflexpr-операнда
вида
(
expression
)
,
expression
должен быть (возможно, многократно заключенным в скобки)
function-call-expression
или
functional-type-conv-expression
.
Если непомещенный в скобки операнд может трактоваться либо как
type-id
, либо как
functional-type-conv-expression
, то он трактуется как
type-id
. Скобки могут использоваться для разрешения неоднозначности между функциональным приведением типа и
type-id
. Например, для типа класса
X
с конструктором по умолчанию,
reflexpr
(
X
(
)
)
отражает функциональный тип
X
(
)
, а
reflexpr
(
(
X
(
)
)
)
отражает выражение
X
(
)
.
Если операнд обозначает одновременно и псевдоним, и имя класса, тип, представленный спецификатором reflexpr, отражает псевдоним и удовлетворяет
reflect::Alias
.
Если операнд обозначает имя, объявление которого заключено в область видимости блока, и именованная сущность не захвачена и не является параметром функции, программа является некорректной.
Типы метаобъектов
Метаобъектный тип
— это безымянный, неполный тип класса в области видимости пространства имён. Тип удовлетворяет концепции
reflect::Object
тогда и только тогда, когда он является метаобъектным типом. Метаобъектные типы могут удовлетворять другим концепциям в зависимости от операнда
reflexpr
.
Не определено, приводит ли многократное применение
reflexpr
к одному и тому же операнду к одному и тому же типу или к другому типу. Если тип метаобъекта отражает неполный тип класса, определенные преобразования типов не могут быть применены.
Метаобъектный тип позволяет исследовать некоторые свойства операнда
reflexpr
с помощью трейтов типов или преобразований типов над ним.
Разрешение перегрузки
Если постфиксное-выражение в выражении-вызова-функции имеет тип класса, т.е. e в выражении-вызова-функции e ( args ) имеет тип класса, то пользовательская функция преобразования типа постфиксного-выражения ( e ) не должна использоваться.
Если postfix-expression не является типом класса, он должен обозначать функцию, которая является уникальным результатом разрешения перегрузки.
struct Functor { void operator()(int) const; using fptr_t = void(*)(std::nullptr_t); operator fptr_t() const; }; using Meta0 = reflexpr(Functor{}(0)); // OK // using Meta1 = reflexpr(Functor{}(nullptr)); // ошибка: использована функция преобразования
Псевдоним — это имя, вводимое с помощью typedef -объявления, alias-объявления или using-объявления .
Сущность или псевдоним
B
является
связанным с рефлексией
для сущности или псевдонима
A
если
-
AиBявляются одной и той же сущностью или псевдонимом, -
Aявляется переменной или перечислителем, аB— типомA, -
Aявляется перечислением, аB— базовым типомA, -
Aявляется классом, аB— членом или базовым классомA, -
Aявляется нешаблонным псевдонимом, который обозначает сущностьB, -
Aне является глобальным пространством имён, аB— охватывающим классом или пространством имёнA, -
Aявляется выражением в скобках (B), -
Aявляется захватом лямбды для типа замыканияB, -
Aявляется типом замыкания для захвата лямбдыB, -
Bявляется типом, указанным functional-type-conv-expressionA, -
Bявляется функцией, выбранной разрешением перегрузки для function-call-expressionA, -
Bявляется возвращаемым типом, типом параметра или типом функцииA, или -
Bсвязан с рефлексией для сущности или псевдонимаX, иXсвязан с рефлексией дляA.
Отношение рефлексивности-отношения является рефлексивным и транзитивным, но не симметричным.
Неформально говоря, случай, когда
B
является рефлексивно связанным с
A
, означает, что
B
участвует в объявлении или определении
A
.
Ноль или более последовательных применений преобразований типов, которые дают метаобъектные типы к типу, обозначенному reflexpr-спецификатором , позволяют исследовать сущности и псевдонимы, которые связаны с рефлексией с операндом; такой метаобъектный тип называется отражающим соответствующую связанную с рефлексией сущность или псевдоним.
struct X; struct B { using X = ::X; typedef X Y; }; struct D : B { using B::Y; }; // только ::X, но не B::X или B::Y связаны с рефлексией для D::Y
Разное
- Выражение, используемое в качестве операнда reflexpr , является невычисляемым выражением и потенциально константно вычисляемым .
-
Для определения переменных,
захватываемых в лямбда-выражении
через capture-default, операнд
reflexprне считается невычисляемым операндом. -
Функция или переменная со статической
продолжительностью хранения
, отраженная метаобъектным типом
T, odr-используется специализацией std :: experimental :: reflect :: get_pointer < T > , как если бы брался адрес id-выражения, называющего функцию или переменную. - Может существовать более одного определения метаобъектного типа при условии, что все операции над этим типом дают одинаковые результаты константных выражений.
-
Тип является
зависимым
, если он обозначен спецификатором reflexpr, и операнд
- является типозависимым выражением или (возможно, заключенным в скобки) функционально-типовым преобразованием с хотя бы одним типозависимым непосредственным подвыражением, или
- обозначает зависимый тип или член неизвестной специализации или значением-зависимое константное выражение .
Ключевые слова
Предопределенные макросы для тестирования возможностей
|
__cpp_reflection
(reflection TS)
|
значение не менее
201902
указывает на поддержку Reflection TS
(макроконстанта) |
Поддержка библиотек
Концепции
|
Определено в заголовочном файле
<experimental/reflect>
|
|
|
Определено в пространстве имён
std::experimental::reflect
|
|
|
Определено во встроенном пространстве имён
std::experimental::reflect::v1
|
|
|
(reflection TS)
|
определяет, что тип является метаобъектным типом
(concept) |
|
(reflection TS)
|
определяет, что тип метаобъекта является типом последовательности метаобъектов
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает область параметров шаблона
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает сущность или псевдоним с ассоциированным (возможно, пустым) именем
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает псевдоним типа, псевдоним пространства имён или псевдоним, введённый using-объявлением
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает
member-declaration
класса
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает перечислитель
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает переменную или член данных
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта удовлетворяет требованиям
RecordMember
,
Enumerator
, или
Variable
, или отражает пространство имен, отличное от глобального пространства имен
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает сущность, имеющую тип
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает пространство имён
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает глобальное пространство имен
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает тип класса, не являющегося объединением
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает тип перечисления
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает тип класса
(concept) |
|
(reflection TS)
|
определяет, что тип метаобъекта отражает пространство имен, класс, перечисление, функцию, тип замыкания, область параметра шаблона
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает тип
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает перечислитель или constexpr переменную
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает прямой базовый класс, полученный из
get_base_classes
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает параметр функции
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает функцию (включая конструкторы и деструкторы)
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает выражение
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает выражение в скобках
(концепт) |
|
(reflection TS)
|
указывает, что метаобъектный тип отражает
function-call-expression
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает
functional-type-conv-expression
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает функцию (исключая конструкторы и деструкторы)
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает функцию-член (исключая конструкторы и деструкторы)
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает специальную функцию-член
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает конструктор
(концепт) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает деструктор
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает операторную функцию или функцию преобразования
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает функцию преобразования
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает тип замыкания необобщённого лямбда-выражения
(concept) |
|
(reflection TS)
|
указывает, что тип метаобъекта отражает захват лямбды
(concept) |
Метаобъектные операции
|
Определено в заголовочном файле
<experimental/reflect>
|
|
|
Определено в пространстве имён
std::experimental::reflect
|
|
|
Определено во встроенном пространстве имён
std::experimental::reflect::v1
|
|
|
|
|
(reflection TS)
|
проверяет, отражают ли два метаобъектных типа одну и ту же сущность или псевдоним
(шаблон класса) |
|
(reflection TS)
|
получает предполагаемый номер строки объявления отраженной сущности или псевдонима
(шаблон класса) |
|
(reflection TS)
|
получает определенный реализацией номер колонки объявления отраженной сущности или псевдонима
(шаблон класса) |
|
(reflection TS)
|
получает предполагаемое имя файла объявления отраженной сущности или псевдонима
(шаблон класса) |
|
|
|
(reflection TS)
|
получает размер последовательности метаобъектов
(шаблон класса) |
|
(reflection TS)
|
получает тип метаобъекта с указанным индексом в последовательности
(шаблон класса) |
|
(reflection TS)
|
применяет шаблон к последовательности метаобъектов
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, является ли отражённая сущность или псевдоним безымянными
(шаблон класса) |
|
(reflection TS)
|
получает неквалифицированное имя отраженной сущности или псевдонима
(шаблон класса) |
|
(reflection TS)
|
получает определенное реализацией отображаемое имя отражаемой сущности или псевдонима
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип метаобъекта, отражающий связанную сущность отраженного псевдонима
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип метаобъекта, отражающий тип отображаемой сущности или псевдонима
(шаблон класса) |
|
(reflection TS)
|
получает тип отражённой сущности или псевдонима
(шаблон класса) |
|
(reflection TS)
|
проверяет, отражает ли метаобъектный тип тип перечисления
(шаблон класса) |
|
(reflection TS)
|
проверяет, отражает ли метаобъектный тип тип объединения
(шаблон класса) |
|
(reflection TS)
|
проверяет, отражает ли тип метаобъекта тип класса (не объединения), объявление которого использует
class
или
struct
соответственно
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип метаобъекта, отражающий область видимости отображаемой сущности или псевдонима
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип метаобъекта, отражающий базовый класс в заданном отношении наследования
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, является ли отражённый член или базовый класс публичным
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли отражённый член или базовый класс защищённым
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли отражённый член или базовый класс приватным
(шаблон класса) |
|
|
|
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все члены данных отраженного класса
(шаблон класса) |
|
|
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все функции-члены отражаемого класса
(шаблон класса) |
|
|
(reflection TS)
|
получает тип последовательности метаобъектов, элементы которой отражают все конструкторы отражаемого класса
(шаблон класса) |
|
(reflection TS)
|
получает тип последовательности метаобъектов, элементы которой отражают все операторные функции и функции преобразования, объявленные в отражаемом классе
(шаблон класса) |
|
(reflection TS)
|
получает тип метаобъекта, отражающий деструктор отраженного класса
(шаблон класса) |
|
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все вложенные типы или typedef-члены отраженного класса
(шаблон класса) |
|
|
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все базовые классы отражаемого класса
(шаблон класса) |
|
|
|
|
(reflection TS)
|
проверяет, является ли отражённое перечисление scoped
(шаблон класса) |
|
(reflection TS)
|
получает тип последовательности метаобъектов, элементы которой отражают перечислители отраженного перечисления
(шаблон класса) |
|
(reflection TS)
|
получает тип метаобъекта, отражающий базовый тип отраженного перечисления
(шаблон класса) |
|
|
|
(reflection TS)
|
получает значение отраженной переменной, которая является константным выражением
(шаблон класса) |
|
(reflection TS)
|
проверяет, объявлена ли переменная с
thread_local
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, имеет ли отражённый параметр аргумент по умолчанию
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип последовательности метаобъектов, элементы которой отражают параметры отраженной функции
(шаблон класса) |
|
(reflection TS)
|
проверяет, содержит ли список параметров отраженной функции параметр с многоточием
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли отражённая функция небросающей исключения
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли отражённая функция удалённой
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, является ли отражённая переменная или функция constexpr
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, является ли отражённое пространство имён или функция встроенными
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип метаобъекта, отражающий неохваченное выражение отраженного охваченного выражения
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип метаобъекта, отражающий функцию в отражённом
function-call-expression
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип метаобъекта, отражающий конструктор в отраженном
functional-type-conv-expression
(шаблон класса) |
|
|
|
(reflection TS)
|
получает адрес отражённой переменной или функции, или значение указателя на член для отражённого нестатического члена
(шаблон класса) |
|
|
|
проверяет, объявлена ли отражённая функция-член с квалификаторами
const
,
volatile
,
&
или
&&
соответственно
(шаблон класса) |
|
|
(reflection TS)
|
проверяет, переопределяет ли отражённая функция-член функцию-член базового класса
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, помечен ли отраженный класс или функция-член как
final
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, имеет ли отраженная переменная статическую продолжительность хранения, или является ли отраженная функция-член статической
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, является ли отраженная специальная функция-член неявно объявленной
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли отраженная специальная функция-член заданной по умолчанию в её первом объявлении
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, объявлен ли отраженный конструктор или функция преобразования с
explicit
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, является ли отражённая функция-член виртуальной
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли отражённая функция-член чисто виртуальной
(шаблон класса) |
|
|
|
(reflection TS)
|
получает тип последовательности метаобъектов, элементы которой отражают захваты отраженного типа замыкания
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли захват по умолчанию лямбда-выражения отраженного типа замыкания
=
или
&
соответственно
(шаблон класса) |
|
(reflection TS)
|
проверяет, объявлен ли
operator()
отражённого типа замыкания с квалификатором
const
(шаблон класса) |
|
|
|
(reflection TS)
|
проверяет, является ли отражённый захват лямбды явным
(шаблон класса) |
|
(reflection TS)
|
проверяет, является ли отражённый захват лямбды init-захватом
(шаблон класса) |
Макросы тестирования возможностей библиотеки
|
Определено в заголовке
<experimental/reflect>
|
|
|
__cpp_lib_reflection
(reflection TS)
|
значение не менее
201902
указывает, что библиотека поддержки Reflection TS поддерживается
(макроконстанта) |
Удовлетворение концепций
В следующей таблице перечислено, удовлетворяет ли тип метаобъекта, отражающий операнд, концепциям, введенным в Reflection TS.
| Категория |
reflexpr
операнды
|
Удовлетворяемые концепции |
|---|---|---|
| Тип | class-name обозначающий union |
reflect::Union
|
| class-name обозначающий closure type |
reflect::Lambda
|
|
| class-name обозначающий класс, не являющийся union |
reflect::Record
|
|
| enum-name |
reflect::Enum
|
|
| template type-parameter |
reflect::Type
,
reflect::Alias
|
|
| decltype-specifier |
reflect::Type
,
reflect::Alias
|
|
| type-name введённый с помощью using-declaration |
reflect::Type
,
reflect::Alias
,
reflect::ScopedMember
|
|
| любой другой typedef-name |
reflect::Type
,
reflect::Alias
|
|
| любой другой type-id |
reflect::Type
|
|
| Пространство имён | namespace-alias |
reflect::Namespace
,
reflect::Alias
|
| глобальное пространство имён |
reflect::GlobalScope
|
|
| любое другое namespace |
reflect::Namespace
|
|
| Выражение | имя члена данных |
reflect::Variable
|
| имя переменной |
reflect::Variable
|
|
| имя перечислителя |
reflect::Enumerator
|
|
| имя параметра функции |
reflect::FunctionParameter
|
|
| имя captured entity |
reflect::LambdaCapture
|
|
| выражение в скобках |
reflect::ParenthesizedExpression
|
|
| function-call-expression |
reflect::FunctionCallExpression
|
|
| functional-type-conv-expression |
reflect::FunctionalTypeConversion
|
Если операнд вида id-expression является константным выражением, тип, указанный спецификатором reflexpr, также удовлетворяет
reflect::Constant
.
Если операнд reflexpr обозначает член класса, тип, представленный спецификатором reflexpr, также удовлетворяет
reflect::RecordMember
.
Смотрите также
|
содержит информацию о некотором типе, класс, возвращаемый оператором typeid
(класс) |
|
|
(C++11)
|
Утилиты информации о типах во время компиляции |