Доброго времени суток.
Почему не возникает ошибки компиляции следующего кода?
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 выдает ошибку.
Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.
A>Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.
Общепринятое нестандартное расширение. Говорят войдёт в новый станадрт...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, ajanov, Вы писали:
A>>Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.
E>Общепринятое нестандартное расширение. Говорят войдёт в новый станадрт...
А можно источник информации?
Здравствуйте, 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 ничего не нашел про доступ... плохо искал?
Здравствуйте, ajanov, Вы писали:
A>Здравствуйте, Erop, Вы писали:
E>>Здравствуйте, ajanov, Вы писали:
A>>>Почему так происходит, дайте ссылку на пункт стандарта, пожалуйста.
E>>Общепринятое нестандартное расширение. Говорят войдёт в новый станадрт... A>А можно источник информации?
Согласно текущему стандарту здесь должна быть ошибка (смотри 11.8), но практически все современные компиляторы учитывают вот этот дефект-репорт: здесь
Здравствуйте, 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 прав — смотри мой ответ выше.