Рассмотрим следующий фрагмент:
static constexpr uint8_t a = 0;
static constexpr const int8_t *b = reinterpret_cast<const int8_t *>(&a);
Не удается скомпилировать с error: a reinterpret_cast is not a constant expression
, потому что стандарт C ++ запрещает , используя reinterpret_cast
в constexpr
.
Однако компиляция завершается успешно, если я хочу сохранить значение b в PROGMEM
(для микроконтроллеров AVR):
static constexpr uint8_t a = 0;
static const int8_t PROGMEM *const b = reinterpret_cast<const int8_t *>(&a);
В этом случае компилятор может доказать, что выражение reinterpret_cast<const int8_t *>(&a)
является константой времени компиляции, поскольку она вставляет свой результат (адрес, указывающий на некоторый байт, содержащий ноль) в программном пространстве в двоичном файле:
_ZL1g:
.zero 1
.section .progmem.data,"a",@progbits
.type _ZL1b, @object
.size _ZL1b, 2
_ZL1b:
.word _ZL1g
Кроме того, я понимаю, что reinterpret_cast
директива времени компиляции Так почему же его нельзя использовать внутри constexpr
?