Доступ к членам внешнего класса.
От: ajanov  
Дата: 31.03.10 16:51
Оценка:
Доброго времени суток.
Почему не возникает ошибки компиляции следующего кода?

class X
{
public:
  struct Y
  {
    void foo(X & x)
    {
      x.a_ = 1; // <-- Здесь должна быть ошибка????!!!!
    }
  };
private:
  int a_;
};

int main()
{
  X x;
  X::Y y;
  y.foo(x);
}


Проверено на MSVC и GCC.
MSVC для ARM выдает ошибку.
Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.
Re: Доступ к членам внешнего класса.
От: Erop Россия  
Дата: 31.03.10 16:52
Оценка: 1 (1)
Здравствуйте, ajanov, Вы писали:


A>Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.


Общепринятое нестандартное расширение. Говорят войдёт в новый станадрт...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Доступ к членам внешнего класса.
От: ajanov  
Дата: 31.03.10 18:21
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, ajanov, Вы писали:



A>>Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.


E>Общепринятое нестандартное расширение. Говорят войдёт в новый станадрт...

А можно источник информации?
Re[2]: Доступ к членам внешнего класса.
От: zaufi Земля  
Дата: 31.03.10 23:46
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, ajanov, Вы писали:



A>>Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.


E>Общепринятое нестандартное расширение. Говорят войдёт в новый станадрт...


нестандартное?

отквочено из 9.7.1:

A class can be defined within another class. A class defined within another is called a nested class. The
name of a nested class is local to its enclosing class. The nested class is in the scope of its enclosing class.
Except by using explicit pointers, references, and object names, declarations in a nested class can use only
type names, static members, and enumerators from the enclosing class.


я правда не вижу тут каких либо указаний на то, что при обращении через указатели\ссылки\имена объектов учитываются обычные правила доступа public/protected/private... в примере который там идет ниже есть обращение к пабликовой поляне внешнего класса из метода внутреннего класса по указателю...

прочитав все из 9.7 ничего не нашел про доступ... плохо искал?
Re[3]: Доступ к членам внешнего класса.
От: Bell Россия  
Дата: 01.04.10 02:02
Оценка:
Здравствуйте, ajanov, Вы писали:

A>Здравствуйте, Erop, Вы писали:


E>>Здравствуйте, ajanov, Вы писали:



A>>>Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.


E>>Общепринятое нестандартное расширение. Говорят войдёт в новый станадрт...

A>А можно источник информации?

Согласно текущему стандарту здесь должна быть ошибка (смотри 11.8), но практически все современные компиляторы учитывают вот этот дефект-репорт: здесь
Любите книгу — источник знаний (с) М.Горький
Re[3]: Доступ к членам внешнего класса.
От: Bell Россия  
Дата: 01.04.10 02:04
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>нестандартное?


Z>отквочено из 9.7.1:


Z>

Z>A class can be defined within another class. A class defined within another is called a nested class. The
Z>name of a nested class is local to its enclosing class. The nested class is in the scope of its enclosing class.
Z>Except by using explicit pointers, references, and object names, declarations in a nested class can use only
Z>type names, static members, and enumerators from the enclosing class.


Этот пункт стандарта не относится к вопросу ajanov — посмотри внимательно на пример, который приведен в 9.7/1.
А насчет нестандартного расширения Erop прав — смотри мой ответ выше.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.