首页 > 解决方案 > 对象传输:通用引用或按值

问题描述

假设一个类只支持显式构造函数或移动语义。但不是默认构造函数或复制构造函数。

class Foo
{
private:
    int* _data;
public:
    Foo(int value) : _data(new int(value)) {}

    Foo(Foo&& f) : _data(f._data)
    {
        f._data = nullptr;
    }

    ~Foo() { delete _data;}

    Foo(Foo& f) = delete;
    Foo() = delete;
    Foo& operator=(Foo& f) = delete;
};

现在假设有另一个组件需要承担上述类的实例的所有权。“Bar”的实例需要通过其构造函数获取 Foo 的所有权。

Foo f(42);
Bar b(std::move(f));     

到目前为止,一切都很好。

但是 Bar 的构造函数应该如何声明呢?我以为是这样的:

class Bar
{
    Foo _f;
public:
    Bar(Foo&& f) : _f(std::move(f)) {}
};

但这也有效:

class Bar
{
    Foo _f;
public:
    Bar(Foo f) : _f(std::move(f)) {}
};

有什么区别,哪个更好?(或者什么时候选择一个而不是另一个?)我什至不知道后者是可能的,直到我观察到 Boost 的 Asio 库通过 value 将套接字传递给处理程序。socket 类具有与上面的 Foo 类类似的约束。

标签: c++

解决方案


推荐阅读