根据我的理解,std::make_pair
和std::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_pair
和std::make_tuple
而不是使用std::pair
和{{1}的构造函数的情况。 }}?
请考虑纯C ++ 1z代码(即不需要向后兼容C ++ 14)并假设每个人都熟悉这个C ++ 1z功能。
答案 0 :(得分:31)
在C ++ 1z中,是否存在使用
std::make_pair
和std::make_tuple
而不是使用std::pair
和std::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
。