Это плохая форма, чтобы предоставить только конструктор перемещения? - PullRequest
7 голосов
/ 06 сентября 2010

Я бы хотел вернуть из функции некопируемый объект типа Foo.В основном это вспомогательный объект, который вызывающий будет использовать для выполнения набора действий, с деструктором для выполнения некоторой очистки после завершения действий.

До появления rvalue ссылок ,Я бы вернул shared_ptr<Foo> или что-то подобное.С ссылками на rvalue другой вариант мог бы сделать конструктор и конструктор копирования частным, а единственным открытым конструктором должен быть конструктор перемещения.Foo будет выглядеть примерно так:

class Foo : boost::noncopyable
{
private:
    Foo( /* whatever the real ctor needs */ );

public:
    Foo( Foo && src );

    // ... interesting stuff ...
};

Foo a( SomethingThatReturnsFoo() ); // allowed
Foo b;      // error, no public default constructor
Foo c( a ); // error, noncopyable
Foo d = a;  // error, noncopyable

Мой вопрос в том, будет ли это плохим поступком, или это выглядит разумно.Я не могу придумать причину, по которой это может вызвать проблемы или затруднить чтение, но я все еще новичок, когда дело доходит до ссылок на ценности, поэтому могут быть соображения, о которых я не думаю.

1 Ответ

9 голосов
/ 06 сентября 2010

Это совсем не плохо - рассматривайте такие объекты, как мьютексы или объекты с областями видимости, такие как unique_ptr.Unique_ptr является подвижным, но не копируемым и является частью STL.

...