constexpr array y std :: initializer_list

Estaba tratando de escribir un valarray en tiempo de compilación que podría usarse de esta manera:

constexpr array<double> a = { 1.0, 2.1, 3.2, 4.3, 5.4, 6.5 };

static_assert(a[0] == 1.0, "");
static_assert(a[3] == 4.3, "");

static_assert(a.size() == 6, "");

Logré hacerlo con la siguiente implementación y funciona bien (con GCC 4.7):

#include <initializer_list>

template<typename T>
struct array
{
    private:

        const std::size_t _size;
        const T* _data;

    public:

        constexpr array(std::initializer_list<T> values):
            _size(values.size()),
            _data(values.begin())
        {}

        constexpr auto operator[](std::size_t n)
            -> T
        {
            return _data[n]
        }

        constexpr auto size() const
            -> std::size_t;
        {
            return _size;
        }
};

A pesar de que funciona bien para mí, no estoy seguro del comportamiento destd::initializer_list y puede usar algunos que son de comportamiento indefinido.

constexpr parastd::initializer_list constructor,begin ysize está bien, aunque no es estrictamente hablando C ++ 11, ya que la N3471 fue adoptada recientemente y cumplió con la norma.

Con respecto al comportamiento indefinido, no estoy seguro de si la matriz subyacente de lastd::initializer_list vivirá o, de no ser así, si existe un medio para que viva más tiempo que soloarray's constructor. ¿Qué piensas?

EDITAR: Puede que no haya sido claro, pero realmente no me importa la matriz real. Lo que realmente me interesa es el comportamiento destd::initializer_list y su matriz subyacente en tiempo de compilación.

Respuestas a la pregunta(1)

Su respuesta a la pregunta