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

js4nwp54  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(460)

只是一个问题看看C++ Boost库(特别是boost::thread类),我最终想到:“如何创建一个类来定义不能被复制但可以从函数返回的对象?“
考虑这个例子,boost::thread类具有我之前提到的特征,所以可以这样做:

boost::thread make_thread();

void f()
{
    boost::thread some_thread=make_thread();
    some_thread.join();
}

字符串
这意味着对象boost::thread不能被复制,但从函数返回,这是可能的。这怎么可能????
我想一定不能提供复制构造函数,但如何处理从函数返回?它不需要使用复制构造函数吗???
谢谢

w8f9ii69

w8f9ii691#

从C++11开始,这是可能的,它通过右值引用提供了移动语义。使用此方法,您可以单独实现移动和/或复制:

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);
    }

    // ...
};

字符串
可以分别禁止复制和移动,因此您可以设置可以移动但不能复制的类。
当然,有一些神奇的技巧可以让你做到这一点,即使你的编译器还不支持移动语义(std::auto_ptr,毕竟当赋值给时是移动而不是复制),所以即使在没有移动语义的情况下,这也可能对boost::thread有效。

zrfyljdw

zrfyljdw2#

这是一个C的高级主题,如果你想在C03中这样做的话。Howard Hinnants Unique_ptr C++03 emulation就是一个例子。
它基本上是通过滥用C重载解析中的几个微妙规则来工作的,特别是非常量引用不能绑定到右值临时变量以及非常量转换函数仍然可以在非常量临时变量上调用的规则。
你也可以使用C
03中使用的auto_ptr技术,但是它被几个小组所破坏,因为auto_ptr允许你复制变量,但从复制对象中窃取资源(其他小组对此有其他意见)。

相关问题