Podczas pisania mojego wstępnego pytania, jeśli jest to nawet możliwe, natknąłem się na pytanie static constexpr member of same type as class being defined, które dość wyraźnie odpowiedziało, że moje czyste rozwiązanie nie jest możliwe w C++ 11.Statyczne elementy constexpr tego samego typu, co zdefiniowana klasa (szczegóły dodatkowe)
Ale potem przyszedł z tym kodem, który jest dość blisko do oryginalnego plakatu i chcę osiągnąć:
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;
};
Więc jestem przeformułowanie moje pytanie: Dlaczego rozwiązanie dla one
kompilacji i może być używane tak, jak byś tego oczekiwał, ale poniższe rozwiązania dają błędy związane z używaniem niekompletnej klasy?
class MyEnum
{
public:
// snip...
static constexpr const MyEnum two = MyEnum(2);
static constexpr const MyEnum three = 3;
// snip...
}
Ciała funkcji składowych są kompilowane tak, jakby znajdowały się po definicji klasy. Oznacza to, że klasa jest kompletna w obrębie ciał funkcji członkowskich. (Zobacz także [CWG 1255] (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#1255)) – dyp