Причина такова, что сообщение об ошибке (за один раз, очень полезно): reinterpret_cast
не допускается в постоянном выражении. Он указан как одно из явных исключений в 5.19 (параграф 2).
Изменение reinterpret_cast
в кастомном стиле C заканчивается семантическим эквивалентом reinterpret_cast
, так что doesn ' t help (и снова сообщение очень явное).
Если у вас был способ получить указатель со значением 0
, вы действительно могли бы использовать p + 0xff
, но я не могу придумать способ получить такой указатель с постоянным выражением. Вы могли бы полагаться на значение нулевого указателя (0
в контексте указателя, как вы, или nullptr
), имеющее значение 0
в вашей реализации, но, как вы видели, ваша реализация отказывается это сделать. Я думаю, что это разрешено. (Например, реализациям разрешено вызывать большинство константных выражений.)