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

226
15 ноября 2017, 01:30

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

Сам код на IdeOne

#include <iostream>
using namespace std;
const int x = 5;
int main(){
    int x[x];
    cout << "OK!" << endl;
    return 0;
}
Answer 1

Нет, это не UB. Согласно стандарту, раздел 6.3.2, клауза 2 упоминает в точности ваш пример:

const int  i = 2;
{ int  i[i]; }

В нём определяется массив из двух целых чисел внутри блока.

Полная цитата из стандарта (перевод мой):

  1. Точка декларации имени находится непосредственно за её полным декларатором (...) и перед инициализатором (если он есть), за исключением замечаний ниже. [ Пример:

    unsigned char x = 12;
    { unsigned char x = x; }

    Здесь второй x инициализируется своим собственным (неопределённым) значением. — конец примера ]

  2. [ Замечание: Имя из внешней области действует вплоть до точки декларации имени, которое его перекрывает. [ Пример:

    const int  i = 2;
    { int  i[i]; }

    определяет внутриблоковый массив из двух целых. — конец примера ] — конец замечания ]

READ ALSO
Управление процессами C++ Linux

Управление процессами C++ Linux

Пытаюсь написать программу ,которая управляет некоторым количеством процессов и следит за ними,а конкретно,если убиваем процесс,то возобновляем...

279
Помощь с указателями

Помощь с указателями

Всем привет, дошел до темы указателей, честно говоря, тема неприятная, поэтому сразу к вам вопросы, товарищи

235
Расчет RECT занимаемый текстом

Расчет RECT занимаемый текстом

Использую библиотеку dwrite для рендера текста в Direct2DТекст хорошо рисуется, проблем никаких нет

188