std::meta::is_accessible
来自 zh.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。如果忽略任何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() {}
参阅
(C++26) |
表示用于访问检查 的上下文(类) |