假设我有以下代码:
class B { /* */ }; class A { vector<B*> vb; public: void add(B* b) { vb.push_back(b); } }; int main() { A a; B* b(new B()); a.add(b); }
假设在这种情况下,所有原始指针B *可以通过unique_ptr< B>处理.
令人惊讶的是,我无法找到如何使用unique_ptr转换此代码.经过几次尝试,我想出了以下代码,编译:
class A { vector<unique_ptr<B>> vb; public: void add(unique_ptr<B> b) { vb.push_back(move(b)); } }; int main() { A a; unique_ptr<B> b(new B()); a.add(move(b)); }
所以我的简单问题是这样做,特别是移动(b)唯一的做法吗? (我正在考虑rvalue引用,但我不完全理解它们.)
如果你有一个关于我没有找到的移动语义,unique_ptr等的完整说明的链接,请不要犹豫,分享一下.
编辑根据http://thbecker.net/articles/rvalue_references/section_01.html,我的代码似乎还行.
实际上,std :: move只是句法糖.对于类X的对象x,move(x)与以下相同:
static_cast <X&&>(x)
需要这两个移动功能,因为转换为r值引用:
>阻止函数“add”传递值
使push_back使用B的默认移动构造函数
显然,如果我改变我的“add”函数来通过引用(普通的lvalue ref),我不需要在main()中的第二个std :: move.
我想要确认这一切,虽然…
解决方法
是的,这是怎么做的.您明确地将所有权从主转移到A.这与以前的代码基本相同,除了它更明确和更可靠.