如何用元组转发unique_ptr?

How to forward unique_ptr with tuple?

想象一个函数期望 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)));
}

目前一切正常

当我想"unpack"这个元组

时出现问题
void forward_to_foo(std::tuple<std::unique_ptr<int>&&>&& t)
{
   foo(std::get<0>(t));
}

我在使用 c++14 的 gcc4.9 上遇到了这个错误:

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

我的问题:这里有什么问题?为什么 std::get<I>(t) 来自右值元组引用 returns 左值?

what is the problem here?

您需要 std::move 才能从 lvalue 表达式移动:

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

Why std::get<I>(t) from tuple of rvalue references returns lvalue?

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