首页 > 解决方案 > 通过指向数据成员的指针访问类成员是否被视为成员访问表达式?

问题描述

解释decltype关键字如何工作的规则之一是:
如果参数是 [...] 一个未加括号的类成员访问表达式,则decltype产生由该表达式命名的实体的类型。https://en.cppreference.com/w/cpp/language/decltype
但是,请考虑以下示例(为简洁起见,伪代码):

struct X {
    int a;
};

X x;
int X::* ptr = &X::a;
std::is_lvalue_reference<decltype(x.*ptr)>::value; //Evaluates to 1. The type is int&
std::is_rvalue_reference<decltype(X().*ptr)>::value; //Evaluates to 1. The type is int&&

这意味着通过指向成员的指针访问类成员不是类成员访问表达式。它被视为只是一个普通表达式,我引用的规则不适用。
因此,我的问题是:我怎么知道什么才是真正的类成员访问表达式decltype?我应该寻找什么来源来找到精确的定义?

标签: c++templatestypeslanguage-lawyerc++20

解决方案


类成员访问在[expr.ref]中定义。

这是:

后缀表达式后跟一个点.或箭头->,可选地后跟关键字template,然后是id 表达式

x.y是类成员访问,get().y是类成员访问,x.template y<int>()是类成员访问等。

但既不是x.*ptr也不X().*ptr是,因为*. 它们是指向成员的操作符,在[expr.mptr.oper]中有描述。它们还具有与类成员访问不同(较低)的优先级:x.*y.z评估为x.*(y.z).


推荐阅读