将移动构造函数委派到适当的复制构造函数是否安全?

Is it safe to harness move constructor delegation to appropriate copy constructor?

提问人:abura 提问时间:6/11/2020 更新时间:6/11/2020 访问量:27

问:

为了避免代码重复,我想将移动构造函数和移动赋值运算符分别委托给适当的复制构造函数和赋值运算符:

struct A 
{
  A() {...} //default constructor 
  A(const A& a) {...} //copy constructor
  A(A&& a):A(static_cast<const A&>(a)) //move constructor 
  {
    a.reset();
  } 
  A& operator =(const A& a) //assignment operator
  {
    if (this != &a)
    {
      ...
    }   
    return *this;
  } 
  A& operator =(A&& a) //move assignment operator
  { 
    if (this != &a)
    {
      this->operator=(static_cast<const A&>(a)); 
      a.reset();
    }   
    return *this;
  } 
  void reset() {...}
}

这是一种安全的技术吗? 这里有什么陷阱或警告吗?

C++11 复制构造函数 赋值运算符 委派 move-constructor

评论

0赞 M.M 6/11/2020
这是合法的,但必须问一下重点是什么。如果您实际上不想传输资源,则可以不声明移动操作,它将回退到复制版本。(代码不应依赖于操作)a.reset
0赞 abura 6/11/2020
@M.M 例如,类中可能有一些shared_ptr,较早重置源实例可能会导致shared_ptr指向的资源提前发布。
0赞 M.M 6/11/2020
对这两种设计的改进是遵循零规则并设计类,以便隐式生成的复制/移动操作做正确的事情

答: 暂无答案