тип указателя на элемент данных базы из-за стандарта

тип выражения &Derived::member из следующего фрагмента не int Derived:: *, а int Base:: * (с g++5):

#include <iostream>
#include <typeinfo>

struct Base { int member ; } ;
struct Derived : Base {} ;

int main ( )
{   
    std::cerr << typeid( &Derived::member ).name() ;       
    return 0 ;
}

согласно стандарту, это ожидаемое поведение? не могу найти ничего, что могло бы прояснить этот пример.

есть как минимум two похожие вопросы, но ни один из них не требует ответа.


person Volodymyr Boiko    schedule 08.01.2017    source источник


Ответы (2)


г++ правильно.

Из стандарта С++ 11:

5.3.1 Унарные операторы

3 Результатом унарного оператора & является указатель на его операнд.

...

 struct A { int i; };
 struct B : A { };
 ... &B::i ... // has type int A::*
person R Sahu    schedule 08.01.2017

Причина, по которой вы видите, что область действия члена int находится внутри Base, а не Derived.

При наследовании можно получить доступ к члену int, но он все еще находится в области действия Base.

person CodeSlapper    schedule 08.01.2017