如何使用元组转发unique_ptr?

时间:2015-03-16 15:52:48

标签: c++ c++11 tuples unique-ptr

想象一个期望rvalue引用std :: unique_ptr。

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

在我的真实世界示例中,有多个参数,所以我决定使用std::tuple<T&&> rvalue引用将参数转发给它 - 所以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));
}

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

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

我的问题:这里有什么问题?为什么来自rvalue引用元组的std::get<I>(t)返回lvalue?

1 个答案:

答案 0 :(得分:7)

  

这里有什么问题?

您需要std::move左值表达式移动:

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

为什么来自rvalue引用元组的std::get<I>(t)返回lvalue?

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