返回右值参考

时间:2019-04-14 18:09:45

标签: c++

我正在努力弄清正在查看的这段代码:

class ShipFactory
{
public:
    Ship make_ship(....) { ... }

    static std::unique_ptr<ShipFactory>&& get_factory()
    {
        if (!m_factory) {
            m_factory.reset(new ShipFactory);
        }
        return std::move(m_factory);
    }

    ...
public:
    static std::unique_ptr<ShipFactory> m_factory;
};

std::unique_ptr<ShipFactory> ShipFactory::m_factory;

...

// used like this:
ship = ShipFactory::get_factory()->make_ship(...);

我的问题是关于get_factory方法的。我真的不明白为什么它返回一个对std :: unique_ptr的右值引用或它将做什么。我也不完全相信这是有效的。

2 个答案:

答案 0 :(得分:1)

auto_ptr不同,您无法复制unique_ptr,因为该构造函数被删除了,而对于unique_ptr来说却毫无意义,因为它拥有指向的内存,但是您可以移动它。这就是这里发生的情况,重置unique_ptr并将其移动。具有与以下相同的效果:

auto ship = make_unique<ShipFactory>();

答案 1 :(得分:0)

请记住,std::move不会移动任何东西;它只是允许发生(并导致右值引用(可能)在重载解析中成为首选)。

返回右值引用(返回在离开函数时不会被破坏的东西!)是对象资源向客户端的提供

auto s=ShipFactory::get_factory()->make_ship(…);  // use the current factory
auto f=ShipFactory::get_factory();  // take the whole current factory

如果没有当前工厂,两条线都将创建工厂;第二个原因导致此后没有当前的工厂(但是unique_ptr f仍然可以使用)。