Ответ 1
К сожалению, вы просто не можете этого сделать!
Некоторые члены static constexpr
могут быть инициализированы inline:
[C++11 9.4.2/3]:
[..] Astatic
член данных типа literal может быть объявлен в определении класса с помощью спецификатораconstexpr
; если это так, в его декларации указывается логический или равный-инициализатор, в котором каждое предложение-инициализатор, являющееся выражением-присваиванием, является постоянным выражением. [..]
Cursor
- это буквальный тип, поэтому это считается.
И использование Cursor
себя как члена данных static
в своем собственном типе не является проблемой, если вы инициализируете его в области лексического пространства имен:
[C++11: 9.4.2/2]:
Объявление элемента данныхstatic
в определении класса не является определением и может быть неполным типом, отличным от vv. Определение для члена данныхstatic
должно появиться в области пространства имен, охватывающей определение класса участников. В определении в области пространства имен имя члена данныхstatic
должно быть квалифицировано его классом с помощью оператора::
. Инициализационное выражение в определении члена данныхstatic
входит в область его класса (3.3.7).
Но вы не можете сделать это с помощью constexpr
:
[C++11: 7.1.5/9]:
Спецификаторconstexpr
, используемый в объявлении объекта, объявляет объект какconst
. Такой объект должен иметь буквальный тип и должен быть инициализирован. [..]
Я думаю, что вся эта формулировка может быть улучшена, но, тем временем, я думаю, вам придется сделать ZERO
нечленом в охватывающем пространстве имен.