Я понимаю, что глобальные типы constexpr
типа класса являются неприменимыми, потому что
-
Такой объект должен быть определен в каждом TU, потому что
constexpr
не разрешает прямое объявление объекта. -
Связь по умолчанию как
static
приведет к присвоению имени (ODR-использование или нет) встроенной функции для нарушения ODR, потому что соответствующие определенияinline
будут иметь разное значение. -
Объявление как
extern constexpr
с одним определением на TU будет нарушать правило ODR, если объект используется ODR, что происходит, когда делается ссылка на него.- Используется ссылка для неявного параметра
this
, даже если он не используется функцией-членом. - Очевидно, что если вы попытаетесь передать объект по ссылке.
- Также случается, если вы попытаетесь передать объект по значению, которое неявно использует конструктор копирования или перемещения, который по определению проходит по ссылке.
- GCC и Clang жалуются на нарушения ODR (несколько определений), если объект объявлен
extern constexpr
, даже если он не используется ODR.
- Используется ссылка для неявного параметра
Это все правильно? Есть ли способ иметь глобальный тип constexpr
типа класса без его переноса в функцию inline
?