Потому, что это очередные костыли через макросы. А так всё это уже было решено давно - с помощью определения через функцию, которая возвращает ссылку на volatile.
Евгений Шатунов, Пример, особенно с флагами оптимизации даёт более чистый выхлоп чем у меня в первом варианте, с видео ознакомлюсь чуть поздней. Пока там стоят int потому, что это пока ещё наброски того что я хочу в итоге, чуть поздней там уже будут нормальные типы - насчёт int я знаю.
После того как соберу всё что есть, скорее уже не сегодня да поправлю формулировку вопроса, и да спасибо за разумную помощь - сам я чувствую что где-то не так понимаю язык.
Евгений Шатунов, https://github.com/no111u3/stm32cclib/blob/7442f12... - это часть HAL. При попытке собрать это вменяемым компилятором, разваливается именно в этой строке. Почему было написано именно так: это позволяет знать компилятору адрес заранее и за счёт этого даже при отсутствии флагов оптимизации все адреса переходят в секцию кода, что существенно упрощает проект и повышает его быстродействие. Если бы хватало знаний стандарта то я бы проверил это всё на Clang заранее, а так в процессе миграции пришлось постфактум смотреть.
Я как бы не отрицаю что все ошибаются, вот ошибся и я, и теперь не знаю в какую сторону мне дальше копать (на самом деле просто психологически сложно признать что кучу кода придётся выкинуть).
Евгений Шатунов, В том то весь и вопрос что конкретно эта часть кода и не собирается компиляторами которые мне нужны, я могу привести ссылку сразу на весь проект (он с открытым исходным кодом), но чтобы не отвлекать людей на поиски проблемы сразу привёл то место которое по мнению компиляторов GCC 6.3 и Clang не правильно.
Не считаю что стандарт прозрачен, раз компиляторы уж слишком вольно его толкуют.
Евгений Шатунов, Согласно стандарту, нельзя использовать в constexpr любые манипуляции с преобразованием типа указателя (то есть использовать reinterpret_cast как таковой, равно как и преобразования от указателя на бестиповый на любой из типов). - согласно вот этой интерпретации: en.cppreference.com/w/cpp/language/constant_expression пункты 13 и 15.
Код позволяет конкретно этот просто указывает место в котором происходит ошибка. А рабочий код позволяет считать указатель константной величиной, которая позволяет сократить размер генерируемого кода, а также оптимизировать работу с ним.