c++ - 通过指向数据成员的指针访问类成员是否被视为成员访问表达式?
问题描述
解释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
?我应该寻找什么来源来找到精确的定义?
解决方案
类成员访问在[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)
.