参见标准库中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条答案
按热度按时间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
,如果您需要保留输入的引用类型以构建元组。