Nieoczekiwany niestały std :: initializer_list

Bawiłem się trochę sztuczką indeksów, aby zobaczyć, gdzie mogę pójść i natknąłem się na dziwny błąd ... Po pierwsze, zwykłe nie tak stare indeksy:

template<std::size_t...>
struct indices {};

template<std::size_t N, std::size_t... Indices>
struct make_indices:
    make_indices<N-1, N-1, Indices...>
{};

template<std::size_t... Indices>
struct make_indices<0, Indices...>:
    indices<Indices...>
{};

Stworzyłem klasę tablicy czasu kompilacji pochodzącą od astd::initializer_list i miał to indeksowalne (załóżmy, żeN3471 to wsparcie twojego kompilatora. Tak czy inaczej będzie w następnym standardzie. Oto jest:

template<typename T>
struct array:
    public std::initializer_list<T>
{
    constexpr array(std::initializer_list<T> values):
        std::initializer_list<T>(values)
    {}

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

Próbowałem więc utworzyć funkcję, która zwraca kopię plikuarray po dodaniu 1 do każdego ze swoich członków:

template<typename T, std::size_t... I>
auto constexpr add_one(const array<T>& a, indices<I...>)
    -> const array<T>
{
    return { (a[I]+1)... };
}

I na koniec kodu, oto mój główny:

int main()
{
    constexpr array<int> a = { 1, 2, 3 };
    constexpr auto b = add_one(a, make_indices<a.size()>());

    return 0;
}

Nie sądziłem, że i tak kod się skompiluje, ale jestem zaskoczony komunikatem o błędzie (Otoideone kod):

In function 'int main()':
error: 'const smath::array<int>{std::initializer_list<int>{((const int*)(& const int [3]{2, 3, 4})), 3u}}' is not a constant expression

Czy ktoś mógłby mi wyjaśnić, co dokładnie nie jest wystarczająco stałe dla kompilatora w powyższym kodzie?

EDYTOWAĆ: Dalsze działania w związku z tym pytaniem

Czy legalne jest zadeklarowanie obiektu constexpr std :: initializer_list?Zamieszanie co do stałej ekspresji

questionAnswers(1)

yourAnswerToTheQuestion