Namespaces
Variants

std::meta::is_accessible

来自 zh.cppreference.net
< cpp | meta
 
 
 
反射库
 
反射类型与查询
反射查询
反射布局查询
类型属性
类型属性查询
 
定义于头文件 <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。如果忽略任何trueusing 声明的效果,MDESIGNATING_CLS 作为 ctx.scope() 的成员在 内可访问,则返回 ;否则返回 false。

该函数将未命名的位域视为具有相同访问权限的非静态数据成员。

参数

r - 一个反射值
ctx - 一个访问上下文

返回值

true如果 r 所表示的内容在上下文 ctx 中可访问,则返回 false

,否则返回

异常如果 表示当前正在定义的类的成员,则抛出 rstd::meta::exception

示例

#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() {}

参阅

表示用于访问检查
的上下文(类)