Ядро константного выражения и индексация массива - PullRequest
0 голосов
/ 21 мая 2018

Ссылка на сегмент кода ниже:

Выражения константы ядра

int main() {
    const std::size_t tabsize = 50;
    int tab[tabsize]; // OK: tabsize is a constant expression

    std::size_t n = 50;
    const std::size_t sz = n;
    int tab2[sz]; // error: sz is not a constant expression
                  // because sz is not initialized with a constant expression
}

Когда я компилирую вышеуказанный сегмент кода, используя (gcc 4.2):

g ++ -ggdb -pedantic -std = c ++ 14 -Wall

для строки, выделенной в коде как ошибка, генерируется только следующее предупреждение:

 warning: variable length arrays are a C99 feature
      [-Wvla-extension]
    int tab2[sz]; // error: sz is not a constant expression
            ^

Это, кажется, противоречит требованию, изложенному в приведенной выше ссылке, что выражение основной константы не должно оценивать неявное преобразование lvalue-> rvalue, если только значение:

не имеет интегралаили тип перечисления и относится к полному энергонезависимому объекту const, который инициализируется постоянным выражением

Оцените ваши мысли.

1 Ответ

0 голосов
/ 21 мая 2018

Поддержка массивов переменной длины - это расширение компилятора, которое стандарт обычно допускает, если оно не заставляет совместимый код вести себя по-разному, и если они говорят , что это расширение (которое GCCделает с этим предупреждением):

Соответствующая реализация может иметь расширения (включая дополнительные библиотечные функции), при условии, что они не изменяют поведение любой правильно сформированной программы.Реализации требуются для диагностики программ, использующих такие расширения, которые не соответствуют требованиям в соответствии с этим документомСделав это, однако, они могут скомпилировать и выполнить такие программы.

[intro.compliance] / 8

При желании, вы можете отключить все расширения через -pedantic-errors.

...