tablica constexpr i std :: initializer_list

Próbowałem napisać kompilację, która mogłaby zostać użyta w następujący sposób:

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, "");

Udało mi się to zrobić za pomocą następującej implementacji i działa dobrze (z 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;
        }
};

Mimo że działa dobrze dla mnie, nie jestem pewien co do zachowaniastd::initializer_list i mogą korzystać z niektórych, które są niezdefiniowanym zachowaniem.

constexpr dlastd::initializer_list konstruktor,begin isize jest w porządku, nawet jeśli nie mówi ściśle C ++ 11 od czasu, gdy N3471 został niedawno zaadaptowany i osiągnął standard.

Jeśli chodzi o niezdefiniowane zachowanie, nie jestem pewien, czy podstawowa tablicastd::initializer_list będzie żył, a jeśli nie, to czy istnieje sposób, aby żyć dłużej niż tylkoarray's konstruktor. Co myślisz?

EDYTOWAĆ: Mogę nie być jasne, ale tak naprawdę nie obchodzi mnie rzeczywista tablica. To, co naprawdę mnie interesuje, to zachowaniestd::initializer_list i jego podstawowa tablica w czasie kompilacji.

questionAnswers(1)

yourAnswerToTheQuestion