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

问题描述 投票:1回答:1
#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?");
}

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

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

c++
1个回答
2
投票

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

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

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

struct A { int i; };
struct B : A { };
... &B::i ... // has type int A::*
© www.soinside.com 2019 - 2024. All rights reserved.