Consider: template < class T > struct Foo { T v; constexpr Foo() : v(){} static const Foo f; }; template < class T > constexpr const Foo<T> Foo<T>::f = Foo(); std::array<int, Foo<std::size_t>::f.v> a; Clang rejects this, because it doesn't eagerly instantiate Foo<size_t>::f, presumably because the constexpr specifier isn't seen until the out-of-line definition is instantiated.