Стандарт С++ 3.4.1:
.4:
Имя, используемое в глобальной области видимости, вне какой-либо функции, класса или объявленного пользователем пространства имен, должно быть объявлено до его использования в глобальной области.
Вот почему глобальные переменные и функции нельзя использовать перед объявлением before.
.5:
Имя, используемое в объявленном пользователем пространстве имен вне определения какой-либо функции или класса, должно быть объявлено до его использования в этом пространстве имен или до его использования в пространстве имен, охватывающем его пространство имен.
то же самое, только что написанное снова, поскольку абзац .4 явно ограничил его использование словом «глобальный», этот абзац теперь говорит: «кстати, это верно и для имен, ребята ...»
.7:
Имя, используемое в определении класса X вне тела функции-члена или определения вложенного класса29, должно быть объявлено одним из следующих способов: - до его использования в классе X или быть членом базового класса X (10.2) , или - если X является вложенным классом класса Y (9.7), перед определением X в Y, или должен быть членом базового класса Y (этот поиск применяется, в свою очередь, к охватывающим Y классам, начиная с самый внутренний охватывающий класс)30, или — если X является локальным классом (9.8) или является вложенным классом локального класса, перед определением класса X в блоке, охватывающем определение класса X, или — если X является член пространства имен N, или является вложенным классом класса, который является членом N, или является локальным классом, или вложенным классом внутри локального класса функции, которая является членом N, до определения класса X в namespace N или в одном из N объемлющих пространств имен.
Я думаю, это говорит обо всем коде, который не стоит в исполняемом процессором коде (например, декларативный код).
и, наконец, самое интересное:
3.3.7 Область действия класса [basic.scope.class]
1 Следующие правила описывают область действия имен, объявленных в классах.
1) Потенциальная область действия имени, объявленного в классе, состоит не только из декларативной области, следующей за точкой объявления имени, но также из всех тел функций, фигурных скобок или равных инициализаторов нестатических элементов данных и аргументов по умолчанию. в этом классе (включая такие вещи во вложенных классах).
2) Имя N, используемое в классе S, должно ссылаться на одно и то же объявление в его контексте и при повторной оценке в завершенной области видимости S. Для нарушения этого правила диагностика не требуется.
3) Если переупорядочивание объявлений элементов в классе дает альтернативную допустимую программу в соответствии с (1) и (2), программа имеет неправильный формат, диагностика не требуется.
в частности, в последнем пункте они используют отрицательную манеру, чтобы определить, что «возможен любой порядок», потому что, если изменение порядка изменит поиск, возникает проблема. это отрицательный способ сказать: «Вы можете переупорядочить что угодно, и все в порядке, это ничего не меняет».
фактически говоря, в классе объявление просматривается в двухэтапной компиляции.
person
v.oddou
schedule
30.07.2014
int i; struct s { void foo() { i = 42; } int i; };
Когдаfoo
определено вне класса,i
явно указывает наthis->i
, и это должно быть то же самое при перемещении определения внутри класса. - person dyp   schedule 30.07.2014