c unique_ptr参数传递

前端之家收集整理的这篇文章主要介绍了c unique_ptr参数传递前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有以下代码
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.这与以前的代码基本相同,除了它更明确和更可靠.

猜你在找的C&C++相关文章