【发布时间】:2011-04-08 20:38:10
【问题描述】:
我想从一个函数返回一个Foo 类型的不可复制对象。这基本上是一个辅助对象,调用者将使用它来执行一组操作,并使用析构函数在操作完成后执行一些清理。
在rvalue references 出现之前,我会返回shared_ptr<Foo> 或类似的东西。使用右值引用,另一种选择是将构造函数和复制构造函数设为私有,并且唯一的公共构造函数是移动构造函数。 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
我的问题是这样做是否会是不好的形式,或者看起来是否合理。我想不出这会导致问题或难以阅读的任何原因,但在右值引用方面我仍然是一个新手,所以可能有一些我没有考虑的因素。
【问题讨论】:
-
次要备注:如果您提供
Move Constructor,人们可能也会期望Move Assignment Operator。你打算提供它,还是想要一个不可变的类? -
在这种特殊情况下,它是不可变的,所以我不想要分配,但总的来说这是一个好点。
-
顺便说一句,随着编译器生成的复制/移动操作部门的最新变化,您实际上不再需要从 boost::noncopyable 派生。声明移动构造函数将阻止编译器生成任何其他复制/移动操作,请参阅open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm
-
对于
delete复制构造函数和复制赋值操作符,是不是更安全,形式也更好?
标签: c++ c++11 rvalue-reference move-constructor move-semantics