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では未対応。