我试图在 C++11 标准的第 5.1.1/8 段(第 87 页)中验证这个陈述(我的重点)
表示一个类的嵌套名称说明符,可选地后跟关键字模板(14.2),然后是该类(9.2)或其基类之一(第 10 条)的成员的名称,是合格的ID;3.4.3.1 描述了对出现在qualified-ids 中的类成员的名称查找。结果是成员。结果的类型是成员的类型。如果成员是静态成员函数或数据成员,则结果为左值,否则为纯右值。
使用以下代码段:
#include <iostream>
namespace N {
class A {
public:
int i;
void f();
};
}
int main()
{
std::cout << &N::A::f << '\n';
std::cout << &N::A::i << '\n';
}
clang
并gcc
编译这段代码,VS2013
需要定义成员函数f
。
他们三个都打印
1
1
但我不知道这些数字是从哪里来的。
根据上面突出显示的段落,表达式N::A::f
是纯右值,而f
不是静态成员函数。尽管如此,我还是能够在代码中获取它的地址。
同时,在第 5.3.1/3 节中写道(强调我的):
一元 & 运算符的结果是指向其操作数的指针。操作数应该是一个左值或一个qualified-id。如果操作数是一个 限定标识符,命名某个类 C 的类型为 T 的非静态成员 m,则结果类型为“指向类型为 T 的类 C 的成员的指针”,并且是一个指定 C::m 的纯右值。
这给人的印象既不是左值N::A::f
也不N::A::i
是左值,因为它们是qualified-id。