如何用元组转发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,因为它表示现有对象而不是临时对象。
想象一个函数期望 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,因为它表示现有对象而不是临时对象。