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

s3r*_*vac 20 c++ c++17

在我的理解中,存在的唯一理由std::make_pair,并std::make_tuple是,你不必自己写的类型,它们会自动推导.在C++ 1z中,我们对类模板进行了模板参数推导,这使我们可以简单地编写

std::pair p(1, 2.5); // C++1z
Run Code Online (Sandbox Code Playgroud)

代替

auto p = std::make_pair(1, 2.5); // C++11/14
Run Code Online (Sandbox Code Playgroud)

情况std::tuple类似.这导致以下问题:在C++ 1Z,有一种情况,其有利于使用std::make_pairstd::make_tuple替代使用的构造std::pairstd::tuple

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

Bar*_*rry 30

在C++ 1Z,有一种情况,其有利于使用std::make_pairstd::make_tuple替代使用的构造std::pairstd::tuple

每条规则都有趣的例外.你想发生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&>
Run Code Online (Sandbox Code Playgroud)

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

此外,由于std::tuple<Ts...>是一个函数模板,您可以将其传递给另一个可能想要执行某些操作的函数模板:

template <typename... Ts>
auto foo(Ts... ts) {
    return std::tuple(ts...);
}
Run Code Online (Sandbox Code Playgroud)

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

  • @NicolBolas不,那会给你`pair <int,int>`(假设你的意思是`r.get()`) (2认同)