如何使用元组转发unique_ptr

How to forward unique_ptr with tuple?

本文关键字:ptr unique 转发 何使用 元组      更新时间:2023-10-16

想象一个函数期望对std::unique_ptr的右值引用。

void foo(std::unique_ptr<int>&& a);

在我的现实世界示例中,有多个参数,因此我决定使用std::tuple<T&&>右值引用将参数转发给它 - 所以std::forward_as_tuple

void forward_to_foo(std::tuple<std::unique_ptr<int>&&>&& t);
int main() {
   forward_to_foo(std::forward_as_tuple(std::make_unique<int>(8)));
}

至于现在一切都很好。

我想"解压缩"这个元组时出现问题

void forward_to_foo(std::tuple<std::unique_ptr<int>&&>&& t)
{
   foo(std::get<0>(t));
}

我在使用 c++4.9 的 gcc14 上收到此错误:

error: cannot bind 'std::unique_ptr<int>' lvalue to 'std::unique_ptr<int>&&'
    foo(std::get<0>(t));

我的问题:这里有什么问题?为什么从右值引用的元组中std::get<I>(t)返回左值?

这里有什么问题?

您需要std::move才能从左值表达式中移动:

foo(std::move(std::get<0>(t)));

为什么从右值引用的元组std::get<I>(t)返回左值?

因为它返回对元组元素的左值引用。通常,返回左值引用的函数的结果是左值,因为它表示现有对象而不是临时对象。