Mentre scrivevo la mia domanda iniziale, se questo è anche possibile, mi sono imbattuto nella domanda static constexpr member of same type as class being defined, che ha chiaramente risposto che la mia soluzione pulita non è possibile con C++ 11.Membri statici constexpr dello stesso tipo della classe definita (dettagli aggiuntivi)
Ma poi mi si avvicinò con questo codice che è abbastanza vicino al manifesto originale e che voglio raggiungere:
class MyEnum
{
public:
constexpr MyEnum() : m_null(true), m_value(0) { }
constexpr MyEnum(const unsigned int v) : m_null(false), m_value(v) { }
constexpr operator unsigned int() const { return m_value; }
static constexpr const MyEnum one() { return MyEnum(1); }
private:
bool m_null;
unsigned int m_value;
};
Così sto riformulare la mia domanda: Perché la soluzione per one
compilazione e può essere usato come ci si aspetterebbe ma le seguenti soluzioni danno errori sull'utilizzo di una classe incompleta?
class MyEnum
{
public:
// snip...
static constexpr const MyEnum two = MyEnum(2);
static constexpr const MyEnum three = 3;
// snip...
}
I corpi delle funzioni membro vengono compilati come se fossero posizionati dopo la definizione della classe. Cioè, la classe è completa all'interno dei corpi delle funzioni dei membri. (Vedi anche [CWG 1255] (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#1255)) – dyp