仅提供移动构造函数是不好的形式?

时间:2010-09-06 16:52:28

标签: c++ c++11 rvalue-reference move-constructor move-semantics

我想从函数返回类型为Foo的不可复制对象。这基本上是一个帮助对象,调用者将使用它来执行一组操作,析构函数在操作完成后执行一些清理。

rvalue references出现之前,我会返回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

我的问题是,这样做是否不好,或者看起来是否合理。我想不出有什么理由会导致问题或者难以阅读,但是当涉及到rvalue引用时,我仍然是一个新手,所以可能有一些我不想的考虑。

1 个答案:

答案 0 :(得分:9)

这根本不是坏形式 - 考虑像互斥体这样的对象或像unique_ptr这样的范围对象。 Unique_ptr是可移动但不可复制的,它是STL的一部分。