Это целое число constexpr не является константой нулевого указателя?

Рассмотрим следующую программу на C ++ 11 и ее результат в GCC 4.7.2:

int main()
{
constexpr int i = 0;
int* p = i;
}

// g++ -g -ggdb -Wall -Wextra -pedantic -std=c++11 t.cpp
// t.cpp: In function 'int main()':
// t.cpp:4:13: error: invalid conversion from 'int' to 'int*' [-fpermissive]
// t.cpp:4:9: warning: unused variable 'p' [-Wunused-variable]

Согласно стандарту:

[C++11: 4.10/1]: константа нулевого указателя является целочисленным константным выражением (5.19) prvalue целочисленного типа с нулевым значением [..]

5.19 беспорядок, и я не смог разобрать его полностью, но мы не ожидаем i чтобы удовлетворить этот критерий и действовать как константа нулевого указателя, следовательно, не требующий явного преобразования в int* для инициализации p?

Компиляция удастся, если я s/constexpr/const/ и скомпилировать с -ansi скорее, чем -std=c++11,

8

Решение

[C++11: 5.19/3]: константное буквальное выражение является основным значением постоянной константы выражения литерального типа, но не типа указателя. интегральное постоянное выражение является литеральным константным выражением целочисленного или незаданного типа перечисления. [..]

А также:

[C++11: 3.9/10]: Тип это буквальный тип если это:

  • скалярный тип; или же
  • ссылочный тип; или же
  • тип класса (раздел 9), который имеет все следующие свойства: [..]
  • массив литерального типа.

На данный момент я не могу найти причину несоответствия этого кода, поэтому я подозреваю, что ошибка GCC.

Однако это может быть преднамеренной ошибкой, поскольку предложенный вами отрывок из 4.10 предлагается изменить (Активный выпуск № 903) так что на самом деле это будет несовместимый код.


Компиляция удастся, если я s/constexpr/const/ и скомпилировать с -ansi скорее, чем -std=c++11,

Определение интегральное постоянное выражение явно разрешен этот случай в C ++ 03:

[C++03: 5.19/1]: [..] Ан интегральная константа-выражение может включать только литералы (2.13), перечислители, константные переменные или статические члены данных целочисленного типа или типа перечисления, инициализированные с помощью константных выражений (8.5), нетиповые параметры шаблона целочисленного типа или типа перечисления, и sizeof выражения. [..]

8

Другие решения

Других решений пока нет …

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×