Страницы

Поиск по вопросам

вторник, 22 января 2019 г.

Переопределение имени глобальной переменной

Почему оно работает? Слышал об предварительном объявлении, но это явно другой случай. Или в чистом виде UB?
Сам код на IdeOne
#include using namespace std; const int x = 5;
int main(){ int x[x]; cout << "OK!" << endl; return 0; }


Ответ

Нет, это не UB. Согласно стандарту, раздел 6.3.2, клауза 2 упоминает в точности ваш пример:
const int i = 2; { int i[i]; }
В нём определяется массив из двух целых чисел внутри блока.

Полная цитата из стандарта (перевод мой):
Точка декларации имени находится непосредственно за её полным декларатором (...) и перед инициализатором (если он есть), за исключением замечаний ниже. [ Пример:
unsigned char x = 12; { unsigned char x = x; }
Здесь второй x инициализируется своим собственным (неопределённым) значением. — конец примера ] [ Замечание: Имя из внешней области действует вплоть до точки декларации имени, которое его перекрывает. [ Пример:
const int i = 2; { int i[i]; }
определяет внутриблоковый массив из двух целых. — конец примера ] — конец замечания ]

Комментариев нет:

Отправить комментарий