移动语义:post set nullptr

时间:2016-05-10 14:54:27

标签: pointers c++11 move-semantics

是否有类似 post increment 运算符的东西将原点指针设置为null?

通缉行为:

Class MyClass{
   public:
   int * ptr;

   MyClass( MyClass && origin) noexcept;
   MyClass(){}
};

MyClass::MyClass( MyClass && origin) noexcept:
   ptr(origin.ptr){origin.ptr=nullptr};   

需要语义的解决方法:

int * moveptr(int * & ptr){
        int * auxptr=ptr;
        ptr=nullptr;
        return auxptr;
}

MyClass::MyClass( MyClass && origin) noexcept: ptr(moveptr( origin.ptr)){};

也许我错过了标准中的某些内容,但我无法找到代表非所有权的指针类型,但也阻止意外分享指针。

我可以将unique_ptr与一个不做任何事情的自定义删除器一起使用,但是这会使指针的原始赋值变得怪异。

1 个答案:

答案 0 :(得分:1)

C ++中没有这样的功能,你必须像moveptr一样自己编写。使用delete ptr;的情况也是如此,有些程序员希望将ptr自动设置为nullptr,但delete不会这样做。

某些程序员使用的另一种方法是使用swap

MyClass::MyClass( MyClass && origin) noexcept : ptr(nullptr)
   { swap(origin); };   


class MyClass {
   // ...
   inline void swap(MyClass & other) {
        using std::swap;
        swap(ptr, other.ptr);
   }
   // ...
};

但在使用它之前,请先阅读它是否值得:

http://scottmeyers.blogspot.com/2014/06/the-drawbacks-of-implementing-move.html

Why do some people use swap for move assignments?