Rokiのチラ裏

学生による学習のログ

Propose to adopt make_array into the IS

C++標準化委員会の文書:Propose to adopt make_array into the IS
make_arrayを規格に導入する提案。

auto ar=std::make_array(1,2,3); // std::array<int,3> ar{1,2,3};

折角なので、実装してみた。

namespace std{
template<class... Args>
constexpr decltype(auto) make_array(Args&&... args)
{
    using type=typename std::decay<typename std::common_type<Args...>::type>::type;
    return std::move(std::array<type,sizeof...(Args)>
            {static_cast<type>(std::forward<Args>(args))...});
}

template<class _Tp>
constexpr decltype(auto) make_array()
{
    return std::move(std::array<_Tp,0>{});
}
};

数行で済む。なんで今まで規格になかったんだろう。*1
以下のように使える。

int main()
{
    { // P0325R1 Exp.
        using namespace std;

        int i=1;
        int& ri=i;
        auto a1=make_array(i,ri);
        auto a2=make_array(i,ri,12L);
        auto a3=make_array<long>(i,ri);
        auto a4=make_array<long>();
        // auto a5=make_array(); ill-formed
        auto a6=make_array<double>(1,2);
    }

    { 
        auto a1=std::make_array("raw array");
        static_assert(std::is_same<decltype(a1),std::array<const char*,1>>::value);
    }
}

*1:目で確認したのでアレだが2013年にはすでに提案自体はあった様子:http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3824.htm