Spec-Zone.ru › C++

std::meta::is_accessible

Определён в заголовке <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() {}

См. также

access_context
(C++26)
контекст для проверки доступа
(класс)

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

Spec-Zone.ru

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