为什么make_tuple删除参数类型的引用

why does make_tuple remove reference of type of args?

本文关键字:类型 引用 参数 删除 make tuple 为什么      更新时间:2023-10-16

请参阅标准库中make_tuple的实现

      // NB: DR 705.
  template<typename... _Elements>
    constexpr tuple<typename __decay_and_strip<_Elements>::__type...>
    make_tuple(_Elements&&... __args)
    {
      typedef tuple<typename __decay_and_strip<_Elements>::__type...>
    __result_type;
      return __result_type(std::forward<_Elements>(__args)...);
    }

返回类型已衰减(引用已删除(? 那么为什么呢? 这个设计有什么问题?

我知道我们有一些替代方法可以实现我的要求,例如 boost::ref。

我的问题是为什么make_tuple必须删除输入类型的引用?

更新:任何人都可以帮助讨论我的问题吗?

我很

好奇,也阅读了这个,我发现了这个 - 我相信这就是你要找的(见链接论文中的第 1 节(:https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2069.html(注意:std::p air 是具有两个元素的 std::tuple 的特定情况。

TLDR:数组不能用T()构造,也不能复制构造。在衰变在std::make_pair年实现之前,不可能有一个有效的std::make_pair版本。

如果有人想知道你应该如何构建元组,请咨询这个

总之,当您需要构建元组时,请使用:

std::make_tuple 如果需要返回元组中的值,

std::tie 如果需要返回的元组中的左值引用,

std::forward_as_tuple是否需要保留输入的引用类型以构建元组。

-- 流利的C++