在C ++ 1z中std :: make_pair和std :: make_tuple的用处

时间:2017-05-09 16:39:25

标签: c++ c++17

根据我的理解,std::make_pairstd::make_tuple存在的唯一原因是您不必自己编写类型,因为它们是自动推断出来的。在C ++ 1z中,我们有template argument deduction for class templates,它允许我们简单地编写

std::pair p(1, 2.5); // C++1z

而不是

auto p = std::make_pair(1, 2.5); // C++11/14

std::tuple的情况类似。这导致了以下问题:在C ++ 1z中,是否存在使用std::make_pairstd::make_tuple而不是使用std::pair和{{1}的构造函数的情况。 }}?

请考虑纯C ++ 1z代码(即不需要向后兼容C ++ 14)并假设每个人都熟悉这个C ++ 1z功能。

1 个答案:

答案 0 :(得分:31)

  

在C ++ 1z中,是否存在使用std::make_pairstd::make_tuple而不是使用std::pairstd::tuple的构造函数的情况?< / p>

每条规则总是有趣的例外。您希望std::reference_wrapper发生什么?

int i = 42;
auto r = std::ref(i);

pair p(i, r);                 // std::pair<int, std::reference_wrapper<int> >
auto q = std::make_pair(i,r); // std::pair<int, int&>

如果你想要后者,std::make_pair就是你想要的。

此外,由于std::make_pair是一个函数模板,您可以将其传递给另一个可能想要做某事的函数模板:

foo(std::make_pair<int, int>);

这似乎并不是非常有用,但是有人在某处使用它来解决问题 - 你不能在那里通过std::pair