想象一个期望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?
答案 0 :(得分:7)
这里有什么问题?
您需要std::move
从左值表达式移动:
foo(std::move(std::get<0>(t)));
为什么来自rvalue引用元组的
std::get<I>(t)
返回lvalue?
因为它返回对元组元素的 lvalue 引用。通常,返回 lvalue 引用的函数的结果是 lvalue ,因为它表示现有对象而不是临时对象。