std::initializer_list で constexpr

規格の方は確認してないんですが、gcc 4.7 では動作しました。

[ソース]

#include <initializer_list>

template<typename T>
constexpr auto
front(std::initializer_list<T> list)
->decltype(*list.begin()){
    return *list.begin();
}

template<typename T>
constexpr auto
at(std::initializer_list<T> list, std::size_t index)
->decltype(*(list.begin() + index)){
    return *(list.begin() + index);
}

constexpr int
plus(int a, int b){
    return a + b;
}

int
main(){
    static_assert(front({1, 2, 3}) == 1, "");

    constexpr auto list = {1, 2, 3};
    static_assert(at(list, 0) == 1, "");
    static_assert(at(list, 1) == 2, "");
    static_assert(at(list, 2) == 3, "");

    static_assert(plus(at(list, 1), at(list, 2)) == 5, "");
    return 0;
}

[コンパイラ]

  • g++ (GCC) 4.7.0 20111210 (experimental)