0

我试图在 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';
}

clanggcc编译这段代码,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

4

1 回答 1

2

但我不知道这些数字是从哪里来的。

指向成员的指针不是指针。没有operator<<可以输出它们的原始值,最好也是唯一的匹配是输出bool值的那个。因此它们被转换为bool(显然产生true)并且输出为1。尝试插入std::boolalpha并再次检查输出。

尽管如此,我还是能够在代码中获取它的地址。

这对你来说有什么惊喜?你引用了允许并解释这个确切结构的部分。它明确指出,采用命名非静态成员的限定 ID 的地址指定该成员。

qualified-id不仅是左值或右值。这完全取决于上下文。如果他们从该成员类或其任何子类之外指定非静态成员,则它们必须是纯右值,因为它们不指定任何特定对象而是值(或信息,换句话说 - 类型和偏移量)。

于 2014-10-13T18:25:25.483 回答