在c ++中创建不可复制但可移动的对象

And*_*dry 10 c++ boost object movable noncopyable

就一个问题.看看C++ Boost库(特别是boost :: thread类)我最后想到:"如何创建一个定义无法复制但可以从函数返回的对象的类?"

那么考虑这个例子,boost :: thread类具有我之前提到的特性,所以可以这样做:

boost::thread make_thread();

void f()
{
    boost::thread some_thread=make_thread();
    some_thread.join();
}
Run Code Online (Sandbox Code Playgroud)

那么这意味着对象boost :: thread无法复制,但是从函数返回,这是可能的.这怎么可能????

我想一定不能提供拷贝构造函数,但是如何处理函数返回?它不需要使用复制构造函数???

谢谢

sbi*_*sbi 6

这在C++ 1x中是可能的,它通过右值引用提供移动语义.使用此功能,您可以分别实现移动和/或复制:

class my_class {
  private:
    data_t* data_;
  public:
    my_class(const my_class& rhs)      // copy constructor
     : data_(rhs.data_.clone())
    {}
    my_class(my_class&& rhs)           // move constructor
     : data_(rhs.data_)
    {
      rhs.data_ = NULL;
    }
    ~my_class() {delete data_;}        // noop if data_==NULL

    my_class& operator=(my_class rhs)  // copy assignment
    {
      this->swap(rhs);
    }
    my_class& operator=(my_class&& rhs)// move assignment
    {
      this->swap(rhs);
    }

    // ...
};
Run Code Online (Sandbox Code Playgroud)

可以单独禁止复制和移动,因此您可以设置可以移动但不能复制的类.

当然,即使你的编译器还不支持移动语义(std::auto_ptr在所有移动而不是在分配时复制),有一些神奇的技巧可以让你这样做,所以这可能适用于boost::thread即使在没有移动语义的情况下也是如此.

  • @sbi:我认为大多数委员会成员和编译器实现者仍然把它称为C++ 0x,所以我认为将**命名为C++ 0x会更公平,因为它是在2010年之前预期的.但是这只是挑剔.:) (2认同)