【问题标题】:Is it bad form to provide only a move constructor?只提供移动构造函数是不好的形式吗?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我什至要补充一点,它是非常好的形式。我真诚地认为可复制对象应该是例外,而不是规则。我越用 C++0x,我对这个想法就越有信心。
猜你喜欢
  • 2018-02-09
  • 2012-10-31
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 2013-06-10
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多