Доступ к приватной структуре
От: Sir-G  
Дата: 05.09.12 08:28
Оценка:
Натукнулся тут на интересную штуку. Проверял на 2008 студии и онлайн компиляторах GCC.
Правомерен ли по стандарту такой доступ к приватной структуре? То, что компилируется и работает на двух основных компиляторах — это баг или фича?
Ссылка на код ideone


class X {
private:
    struct B {
        B() { y = 2012; }
        int y;
    };
    B* b;

public:
    X() { b = new B(); }
    B* GetB() { return b; }
};

int main()
{
    X x;
    // Why do we have access to X::B here?
    std::cout << x.GetB()->y;

    return 0;
}
Re: Доступ к приватной структуре
От: uzhas Ниоткуда  
Дата: 05.09.12 08:52
Оценка:
Здравствуйте, Sir-G, Вы писали:

а вот и новый стандарт в действии: http://ideone.com/m0Pns
Re: Доступ к приватной структуре
От: ntp  
Дата: 05.09.12 10:36
Оценка:
Здравствуйте, Sir-G, Вы писали:

SG>Натукнулся тут на интересную штуку. Проверял на 2008 студии и онлайн компиляторах GCC.

SG>Правомерен ли по стандарту такой доступ к приватной структуре? То, что компилируется и работает на двух основных компиляторах — это баг или фича?

Это, случаем, не аналогично локальному классу? Когда использовать его тоже можешь, а вот наследоваться — нет.
Re: Доступ к приватной структуре
От: Masterkent  
Дата: 05.09.12 12:25
Оценка: 87 (4)
Sir-G:

SG>Правомерен ли по стандарту такой доступ к приватной структуре?


Да.

SG>То, что компилируется и работает на двух основных компиляторах — это баг или фича?


Фича.

SG>Ссылка на код ideone


SG> // Why do we have access to X::B here?


Потому что типы сами по себе не обладают такой характеристикой, как доступность в некотором контексте. Концептуально доступность — это либо свойство объявления, либо статус базового класса по отношению к производному в определённом контексте.

Если некая конструкция ссылается на какую-то сущность за счёт непосредственного использования недоступного в данном контексте объявления, то такая конструкция некорректна. На один и тот же тип иногда можно сослаться при помощи разных объявлений, одни из которых в некотором месте могут быть доступными, а другие в том же самом месте — недоступными:

class X
{
    struct A {};
public:
    typedef A B;
};

int main()
{
    X::B(); // OK
    X::A(); // error
}
Re[2]: Доступ к приватной структуре
От: Sir-G  
Дата: 05.09.12 12:48
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>Потому что типы сами по себе не обладают такой характеристикой, как доступность в некотором контексте. Концептуально доступность — это либо свойство объявления, либо статус базового класса по отношению к производному в определённом контексте.

Masterkent, спасибо за разъяснение!
Отлично, что компиляторы работают правильно.
Плохо, что надо немного перестроить систему понятий в голове. =))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.