Рассмотрим следующую программу на 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
,
[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
выражения. [..]
Других решений пока нет …