Namespaces
Variants

std::meta::has_identifier

来自 zh.cppreference.net
< cpp | meta
 
 
 
反射库
 
反射类型和查询
反射查询
反射布局查询
类型属性
类型属性查询
 
定义为头文件 <meta>
consteval bool has_identifier( std::meta::info r );

(自C++26起)r确定 所表示的内容是否具有关联的标识符(包括字面量后缀标识符

)。

  • 正式来说: r如果 表示一个具有用于链接目的的typedef名称的实体,则返回 true。
  • 否则,如果 r 表示一个未命名的类、枚举、变量、位域或命名空间,则返回 false。
  • 否则,如果 r 表示一个类型别名,则返回 !std::meta::has_template_arguments(r)。
  • 否则,如果 r 表示一个类型,则返回 true 如果:
  • r表示一个 cv 不限定的类类型且 std::meta::has_template_arguments(r) 是 false,或者
  • r表示一个 cv 不限定的枚举类型。
  • 否则,如果 r 表示一个函数,则返回 true 如果 std::meta::has_template_arguments(r) 是 false,且该函数不是构造函数、析构函数、运算符函数或转换函数。
  • 否则,如果 r 表示一个模板,则返回 true 如果该模板不是构造函数模板、运算符函数模板或转换函数模板。
  • 否则,如果 r 表示一个函数参数,该函数是从函数模板实例化而来的,且该参数是函数参数包的一个元素,则返回 false。
  • 否则,如果 r 表示一个函数 P 的函数参数F,令 S 为从求值上下文中的某个点可达的声明集合,忽略任何显式实例化,这些声明声明了 F 或 F 为其特化的模板化函数;返回 true 如果
  • 存在一个声明 D 在 S 中为 N 引入了一个名称 P,或者为 P 所声明的模板化函数中对应于 D 的参数引入了名称,
  • 并且 S 中没有声明使用除 N 之外的任何名称来做到这一点。
void fun(int);
constexpr std::meta::info r = parameters_of(^^fun)[0];
static_assert(!has_identifier(r));

void fun(int x);
static_assert(has_identifier(r));

void fun(int x);
static_assert(has_identifier(r));

void poison() {
    void fun(int y);
}
static_assert(!has_identifier(r));
  • 否则,如果 r 表示一个变量,则返回 false 如果该变量对应于函数参数包的一个元素,或者 std::meta::has_template_arguments(r) 是 true,否则返回 true。
  • 否则,如果 r 表示一个结构化绑定,则返回 false 如果该结构化绑定是结构化绑定包的一个元素,否则返回 true。
  • 否则,如果 r 表示一个枚举项、非静态数据成员、命名空间或命名空间别名,则返回 true。
  • 否则,如果 r 表示一个直接基类关系,则返回 std::meta::has_identifier(std::meta::type_of(r))。
  • 否则,如果 r 表示一个数据成员描述 (T, N, A, W, NUA, ANN),则返回 true 如果该描述的名称 N 不是 ⊥。
  • 否则,返回 false。

参数

r - 一个反射值

返回值

true如果 r 所表示的内容具有标识符,则为 false,否则

。

原因:无示例

u8symbol_of
(C++26)将 meta::operators
枚举项转换为其符号名称
u8identifier_of
(C++26)
如果反射的实体有标识符,则获取其名称
u8display_string_of
(C++26)
获取适合标识反射实体的字符串
(函数)