Страницы

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

пятница, 3 января 2020 г.

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

#cpp #cpp11


Почему оно работает? Слышал об предварительном объявлении, но это явно другой случай.
Или в чистом виде UB?

Сам код на IdeOne

#include 
using namespace std;
const int x = 5;

int main(){
    int x[x];
    cout << "OK!" << endl;
    return 0;
}

    


Ответы

Ответ 1



Нет, это не 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]; } определяет внутриблоковый массив из двух целых. — конец примера ] — конец замечания ]

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

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