c++ 为什么make_tuple会移除args类型的引用?

jxct1oxe  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(123)

参见标准库中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必须删除对输入类型的引用?
更新:有人能帮助讨论我的问题吗?

p8h8hvxi

p8h8hvxi1#

我很好奇,阅读了这一点,以及我发现了这个-我相信这是你正在寻找(见第1节中的链接文件):https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2069.html(注意:std::pair是具有两个元素的std::元组的特例。)
TLDR:数组不能用T()构造,也不能复制构造。在std::make_pair中实现衰减之前,不可能有有效的std::make_pair版本。
如果有人想知道应该如何构建元组,请参考以下内容
总之,当您需要构建元组时,请使用:
std::make_tuple如果需要返回元组中的值,
std::tie如果需要在返回的元组中引用左值,
std::forward_as_tuple,如果您需要保留输入的引用类型以构建元组。

相关问题