Есть образец кода который успешно собирается на GCC вплоть до 6.1, но при этом не собирается на GCC 6.3 и не собирается на любой версии Clang.
constexpr int * const t = reinterpret_cast<int *>(0x40000);
template <int addr>
class C {
public:
struct gpio_t {
int test;
};
static constexpr volatile gpio_t * const regs =
reinterpret_cast<volatile gpio_t *>(addr);
};
int main() {
C<0x40000000>::regs->test = 5;
}
В ходе раскопок понял что это происходит от того что любые манипуляции с адресной арифметикой запрещены в самом стандарте, отсюда последовал вопрос, как не меняя эффективности и безопасности кода сделать так чтобы он соответствовал стандарту.