constexpr: definición y declaración para miembros constexpr

Si quiero usar algunas cosas de conveniencia comomake_array No tengo oportunidad de declarar mi matriz primero y luego hacer la definición como se hizo en tiempos "anteriores" porque el tipo de mi var no está disponible antes de la definición.

Entonces encontré esta respuesta:
Referencia indefinida a static constexpr char []

En el siguiente ejemplo, escribí esta solución que se compila bien con gcc y no estoy seguro de que este sea un código C ++ realmente válido, porque es más o menos una declaración con definición y luego una definición sin contenido. ¿Esto está permitido? (Compilar bien no es una garantía de que el código sea válido en c ++)

#include <experimental/array>
#include <iostream>

class Foo
{
    private:
    static decltype(auto) constexpr Bar =
        std::experimental::make_array(
            std::experimental::make_array( 1,2,3 ),
            std::experimental::make_array( 4,5,6 )
            );

    public:
    using ARR_TYPE = decltype( Bar );

    static auto& GetArr( int idx )
    {
        // range check ...
        return Bar[idx];
    }
};

constexpr Foo::ARR_TYPE Foo::Bar;

int main()
{
    for ( auto el: Foo::GetArr(0))
    {
        std::cout << el << std::endl;
    }
 }

Respuestas a la pregunta(1)

Su respuesta a la pregunta