2017-12-22 2 views
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?"); 
} 

このコードをコンパイルする際に私が試したすべてのコンパイラ、つまり静的アサートは起動しません。これは、基本クラスから継承したメンバのアドレスを取得すると、メンバを指定するときに派生クラス名を明示的に使用しても、その結果のメンバへのポインタが、そのメンバの基底クラスを参照することを意味します。ベースクラスのメンバへのポインタの型を控除

私はこの仕様のどこに明示的に呼び出されているのか、この振る舞いの背後にある理由を知りたいのは興味があります。

答えて

2

オペランドが修飾-IDタイプTといくつかのクラスCの非静的または変異体Mを命名された場合、結果が入力た

言うた、[expr.unary.op]を参照してください"タイプTのクラスCのメンバへのポインタ"であり、C :: mを指定するprvalueである。

また、この動作を表示する例を示します:

struct A { int i; }; 
struct B : A { }; 
... &B::i ... // has type int A::* 
関連する問題