std :: make_array的当前状态

时间:2018-06-20 07:25:54

标签: c++ arrays

建议here提出的std::make_array函数的当前状态是什么?我找不到有关其潜在接受度的任何信息。根据{{​​3}},它位于std::experimental命名空间中。 cppreference.comC++ compiler supportWikipedia-C++17和C ++ 17标准草案中都没有提及。

4 个答案:

答案 0 :(得分:6)

LEWG投票赞成为C ++ 20 merge paper转发back in 2016(这是在C ++ 17功能冻结之后)。根据作者的要求,其LWG issue 2814的解决方案将暂停其LWG审核。

答案 1 :(得分:5)

正如@DeiDei所写,C ++ 17包含template argument deduction for classes,因此您现在可以编写:

std::pair p (foo, bar);
std::array arr = { 1, 2, 3, 4, 5 };

,依此类推。但是还有一些(有些微妙)的剩余用例,其中make_pairmake_array可能有用,您可以在Usefulness of std::make_pair and std::make_tuple in C++1z中阅读它们。

答案 2 :(得分:1)

answer提供了提案的状态-但是-在C ++ 17中很容易实现-至少这部分:

  

[示例:

int i = 1; int& ri = i;
auto a1 = make_array(i, ri);         // a1 is of type array<int, 2>
auto a2 = make_array(i, ri, 42L);    // a2 is of type array<long, 3>
auto a3 = make_array<long>(i, ri);   // a3 is of type array<long, 2>
auto a4 = make_array<long>();        // a4 is of type array<long, 0>
auto a5 = make_array();              // ill-formed    auto a6 = make_array<double>(1, 2);  // ill-formed: might narrow –end example]

请参阅:

template <typename Dest=void, typename ...Arg>
constexpr auto make_array(Arg&& ...arg) {
   if constexpr (std::is_same<void,Dest>::value)
      return std::array<std::common_type_t<std::decay_t<Arg>...>, sizeof...(Arg)>{{ std::forward<Arg>(arg)... }};
   else
      return std::array<Dest, sizeof...(Arg)>{{ std::forward<Arg>(arg)... }};
}

证明:

int main() {
    int i = 1; int& ri = i;
    auto a1 = make_array(i, ri);         // a1 is of type array<int, 2>
    std::cout << print<decltype(a1)>().get() << std::endl; 
    auto a2 = make_array(i, ri, 42L);    // a2 is of type array<long, 3>
    std::cout << print<decltype(a2)>().get() << std::endl;
    auto a3 = make_array<long>(i, ri);   // a3 is of type array<long, 2>
    std::cout << print<decltype(a3)>().get() << std::endl;
    auto a4 = make_array<long>();        // a4 is of type array<long, 0>
    std::cout << print<decltype(a4)>().get() << std::endl;
    // auto a5 = make_array();              // ill-formed
    // auto a6 = make_array<double>(1, 2);  // ill-formed: might narrow
}

输出:

std::__1::array<int, 2ul>
std::__1::array<long, 3ul>
std::__1::array<long, 2ul>
std::__1::array<long, 0ul>

最后一行make_array<double>(1, 2)产生“缩小转换”错误-根据提案的要求。通过在实现中添加static_cast可以对其进行“改进”。

在最新的叮当声中-demo

答案 3 :(得分:0)

现在有一个实验性的make_array

https://en.cppreference.com/w/cpp/experimental/make_array

  

在标题<experimental/array>

中定义      

template <class D = void, class... Types> constexpr std::array<VT /* see below */, sizeof...(Types)> make_array(Types&&... t);

     

(库基础知识TS v2)