This code compiles:
struct Info { constexpr Info(bool val) : counted(false), value(unsigned(val)) {} constexpr Info(unsigned val) : counted(true), value(val) {} bool counted; unsigned value; }; constexpr const auto data = std::array{ Info{true}, Info{42u} }; struct Foo { constexpr static inline const auto data = std::array{ Info{true}, Info{42u} }; }; This code does not:
struct Foo { struct Info { constexpr Info(bool val) : counted(false), value(unsigned(val)) {} constexpr Info(unsigned val) : counted(true), value(val) {} bool counted; unsigned value; }; constexpr static inline const auto data = std::array{ Info{true}, Info{42u} }; }; The reported error (in MSVC, gcc, and clang) suggests that they think the Info constructor is not defined or is not constexpr, eg. from clang:
prog.cc:21:5: note: undefined constructor 'Info' cannot be used in a constant expression Info{true}, Info{42u} ^ Why?
(Possibly related to this question, but Info should be complete at the point of use; only Foo is still incomplete.)