在我的理解中,std::make_pair
和std::make_tuple
存在的唯一原因是你不必自己写类型,因为它们是自动推导出来的。
std::pair p(1, 2.5); // C++17
而不是
auto p = std::make_pair(1, 2.5); // C++11/14
std::tuple
的情况类似。这导致以下问题:在C17中,是否存在使用std::make_pair
和std::make_tuple
而不是使用std::pair
和std::tuple
的构造函数的情况?
请考虑纯C17代码(即不需要向后兼容C14),并假设每个人都熟悉C17的这个特性。
1条答案
按热度按时间y1aodyip1#
在C++1z中,是否存在使用
std::make_pair
和std::make_tuple
而不是使用std::pair
和std::tuple
的构造函数的情况?每一条规则总有有趣的例外。你希望
std::reference_wrapper
发生什么?如果你想要后者,
std::make_pair
就是你想要的。另一种情况出现在泛型代码中,假设我有一个模板参数包,我想把它变成一个元组,我会这样写吗?
现在,这段代码的目的可能是从中得到一个
std::tuple<Ts...>
,但这并不一定会发生。它取决于Ts...
:Ts...
是一个本身是tuple
的单个对象,则会得到它的一个副本。也就是说,foo(std::tuple{1})
给我的是tuple<int>
而不是tuple<tuple<int>>
。Ts...
是一个pair
的对象,我得到的是这些元素的tuple
。也就是说,foo(std::pair{1, 2})
给我的是tuple<int, int>
而不是tuple<pair<int, int>>
。在泛型代码中,我会避免对
tuple
这样的类型使用CTAD,因为它永远不清楚你会得到什么。make_tuple
没有这个问题。make_tuple(tuple{1})
是tuple<tuple<int>>
,make_tuple(pair{1, 2})
是tuple<pair<int, int>>
,因为这是你要求的。此外,由于
std::make_pair
是一个函数模板,您可以将其传递到另一个可能想要执行某些操作的函数模板中:这看起来不是很有用,但是某个地方的某个人正在使用它来解决问题-您不能只是在那里传递
std::pair
。