作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
想象一个函数期望对 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++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)
从右值引用的元组返回左值?
最佳答案
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?
因为它返回对元组元素的左值 引用。通常,返回左值 引用的函数的结果是左值,因为它表示现有对象而不是临时对象。
关于c++ - 如何用元组转发unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29081236/
我是一名优秀的程序员,十分优秀!