Сейчас просматривал раздел нового стандарта С++ 2011, описывающий вложенные классы, и обнаружил такое интересное отличие от предыдущего стандарта. В параграфе #1 приводится пример корректного обращения во вложенном классе к членам, объявленным в во внешнем классе. Для простоты я сокращу пример до минимума
class enclose
{
public:
int x;
class inner
{
void f( int i )
{
int a = sizeof( x ); // Смотри ниже комментарий
}
};
};
Так, вот, в стандарте С++ 2003 напротив помеченной мной строки имеется комментарий
// error: refers to enclose::x, то есть во вложенном классе нельзя ссылаться на не статические члены внешнего класса.
Теперь, в новом стандарте С++ 2011 напротив этой строки уже другой комментарий:
// OK: operand of sizeof is an unevaluated operand Вот теперь будет путаница у программистов! Кто-то увидет подобный код и категорично заявит, что это - ошибка. А кто-то другой скажет, что это совершенно корректный код. И будут спорить до посинения!:)
Вообще-то, период перехода от одного стандарта к другому порой создает серьезные проблемы!