#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?");
}
我已经尝试过的所有编译器都成功编译了这个代码,即静态断言不会触发。这意味着如果我获取从基类继承的成员的地址,则结果指向成员的指针引用成员来自的基类,即使我在指定成员时显式使用派生类名。
我很想知道这个明确地被调出的规范在哪里,以及这种行为背后的原因,因为它似乎有点反直觉(至少对我天真的自我)。
见[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::*