Mr.*_*C64 6 c++ pointers move c++11
observer_ptr移动操作后为什么不归零?
它nullptr在默认构造中正确设置,这确实有意义(并防止指向垃圾).
,因此,它应该被清零时,std::move()从"d一样std::string,std::vector等等.
这将使它成为原始指针有意义的几个上下文中的一个很好的候选者,以及在具有原始指针数据成员的类上自动生成移动操作,就像在这种情况下一样.
编辑
正如@JonathanWakely在评论中指出的那样(这与上述问题有关):
如果
observer_ptr在移动后为null,则可以使用它来为具有指针成员的类型实现Zero of Zero.这是一个非常有用的功能.
Jon*_*ely 10
似乎很多人一开始就错过了这个想法的观点和效用.
考虑:
template<typename Mutex>
class unique_lock
{
  Mutex* pm;
public:
  unique_lock() : pm() { }
  unique_lock(Mutex& m) : pm(&m) { }
  ~unique_lock() { if (pm) pm->unlock(); }
  unique_lock(unique_lock&& ul) : pm(ul.pm) { ul.pm = nullptr; }
  unique_lock& operator=(unique_lock&& ul)
  {
    unique_lock(std::move(ul)).swap(*this);
    return *this;
  }
  void swap(unique_lock& ul) { std::swap(pm, ul.pm); }
};
Run Code Online (Sandbox Code Playgroud)
使用"哑"智能指针,它是null-on-default-construction和null-after-move,你可以默认三个特殊成员函数,所以它变为:
template<typename Mutex>
class unique_lock
{
  tidy_ptr<Mutex> pm;
public:
  unique_lock() = default;                            // 1
  unique_lock(Mutex& m) : pm(&m) { }
  ~unique_lock() { if (pm) pm->unlock(); }
  unique_lock(unique_lock&& ul) = default;            // 2
  unique_lock& operator=(unique_lock&& ul) = default; // 3
  void swap(unique_lock& ul) { std::swap(pm, ul.pm); }
};
Run Code Online (Sandbox Code Playgroud)
这就是为什么有一个愚蠢的,非拥有的智能指针是非常有用的,这个指针在移动后是空的,就像 tidy_ptr
但是observer_ptr只有null-on-default-construction,所以如果它是标准化的,那么声明一个函数来获取非拥有指针会很有用,但是对于像上面这样的类来说它没有用,所以我会还需要另一个非拥有的哑指针类型.有两个非拥有的哑智能指针类型似乎比没有没有!
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           785 次  |  
        
|   最近记录:  |