std::meta::is_accessible
С ru.cppreference.net
| Определён в заголовочном файле <meta>
|
||
consteval bool is_accessible( std::meta::info r, std::meta::access_context ctx );
|
(начиная с C++26) | |
Определяет, является ли элемент или базовый класс, представленный r является доступным в контексте ctx.
Если r не представляет элемент класса или отношение прямого базового класса, возвращает true. В противном случае, пусть:
PARENT_CLSбудет классом, который содержит объявление того, чтоrпредставляет, или производным классом в отношении прямого базового класса;DESIGNATING_CLSбудетctx.designating_class(), если это не нулевая рефлексия, илиPARENT_CLSв противном случае.
Результат определяется следующим образом:
- Если
DESIGNATING_CLSне является тем же или производным отPARENT_CLS, то возвращаетfalse. - В противном случае, если
ctx.scope()является нулевой рефлексией, то возвращаетtrue. - В противном случае, если
rпредставляет отношение прямого базового класса, где базовым классом являетсяB, возвращаетtrue, если базовый классBклассаDESIGNATING_CLSдоступен внутриctx.scope(); в противном случае возвращаетfalse. - В противном случае,
rпредставляет элемент M. возвращаетtrue, если M как элементDESIGNATING_CLSбыл бы доступен внутриctx.scope()при игнорировании эффекта любого using-объявления; в противном случае возвращаетfalse.
Эта функция обрабатывает безымянное битовое поле как нестатический элемент данных с тем же доступом.
Параметры
| r | - | значение рефлексии |
| ctx | - | контекст доступа |
Возвращаемое значение
true если то, что r представляет, доступно в контексте ctx, в противном случае false
Исключения
Выбрасывает std::meta::exception, если r представляет элемент класса, который в данный момент определяется.
Пример
Запустить этот код
#include <meta>
consteval std::meta::access_context fn()
{
return std::meta::access_context::current();
}
class C
{
[[maybe_unused]] int moo;
friend consteval std::meta::access_context fn();
public:
static constexpr auto r{^^moo};
};
static_assert(is_accessible(C::r, fn()) == true);
static_assert(is_accessible(C::r, std::meta::access_context::current()) == false);
static_assert(is_accessible(C::r, std::meta::access_context::unchecked()) == true);
int main() {}
См. также
(C++26) |
представляет контекст для проверки доступа (класс) |