Ответ 1
Глобальные константы constexpr могут быть ODR безопасно определены в заголовках, используя бит макромагии и дополнительный уровень взаимного указателя
#define PP_GLOBAL_CONSTEXPR_VARIABLE(type, var, value) \
namespace var##detail { \
template<class = void> \
struct wrapper \
{ \
static constexpr type var = value; \
}; \
template<class T> \
constexpr type wrapper<T>::var; \
} \
namespace { \
auto const& var = var##detail::wrapper<>::var; \
}
Макрос предоставляет ссылку внутри неназванного пространства имен к экземпляру объекта в шаблоне класса реализации.
Каждый объект в неназванном пространстве имен внутри заголовка генерирует уникальный экземпляр в каждой единицы перевода, включающий его заголовок. Кроме того, чтобы предотвратить нарушения ODR, важно, чтобы объекты в частности. множественные экземпляры шаблона функции одинаковы.
Однако для ссылок не имеет значения, что они имеют другую идентичность; до тех пор, пока они ссылаются на один и тот же экземпляр объекта в реализации шаблон класса.
Вы можете обернуть этот макрос в заголовок и безопасно включить его во многие TU без проблем.
Более подробную информацию см. в следующем обсуждении в списке рассылки Boost: http://lists.boost.org/Archives/boost/2007/06/123380.php