对基类的指针成员的推导类型

时间:2017-12-22 21:24:23

标签: c++

#include <type_traits>

struct BaseClass
{
    int baseValue;
};

struct DerivedClass : public BaseClass
{
    int derivedValue;
};

int main()
{
    auto memDataPtr = &DerivedClass::baseValue;

    static_assert(std::is_same<decltype(memDataPtr), int BaseClass::*>::value, "Huh?");
}

我成功编译此代码的所有编译器,即静态断言不会触发。这意味着如果我获取从基类继承的成员的地址,则结果指向成员的指针引用成员来自的基类,即使我在指定成员时显式使用派生类名。

我很想知道规范中哪些被明确地说出来,以及这种行为背后的原因,因为它似乎有点反直觉(至少对我天真的自我)。

1 个答案:

答案 0 :(得分:2)

参见[expr.unary.op],其中说

  

如果操作数是一个qualified-id,命名一个类型为T的某个类C的非静态或变体成员m,则结果类型为“指向类型为C的C类成员的指针”,并且是一个指定C的prvalue: :M

它还给出了一个显示此行为的示例:

struct A { int i; };
struct B : A { };
... &B::i ... // has type int A::*