Rokiのチラ裏

学生による学習のログ

C++17 std::array 規格によりほぼconstexpr化

C++14までではレガシー配列とstd::initializer_list*1がconstexprに対応していた*2が、C++17以降、std::arrayはfillとswapメンバ関数以外の全てを、constexpr化するとの事。

#include<array>

template<class _Tp>
using Container_value_t=typename _Tp::value_type;

template<class _Tp>
constexpr Container_value_t<_Tp> sum(const _Tp& ar)
{
    Container_value_t<_Tp> result=0;
    for(auto b_it=std::cbegin(ar),e_it=std::cend(ar); b_it!=e_it; ++b_it)result+=*b_it;
    return result;
}

int main()
{
    constexpr std::array<int,5> ar{1,2,3,4,5,};
    constexpr int result=sum(ar);
}

因みに、16/07/20現時点、GCC HEAD 7.0.0やClang HEAD 3.9.0では未対応。

参考

*1:初期化子リスト

*2:constexpr関数内でも使用する事ができるの意