我正在阅读“Scott Meyers 的Effective C++”,其中第 11 条建议在我的赋值运算符中使用“ copy-and-swap ”技术:

Widget& Widget::operator=(const Widget &rhs)
{
    Widget temp(rhs); // Copy constructor
    swap(temp); //Swap with *this
    return *this;
}

但是在第 12 条中是这样写的:



我认为第 11 项和第 12 项是矛盾的。我理解错了吗?

最佳答案

在您提到的“由 Scott Meyers 撰写的有效 C++”的 2 次引用中,讨论了两个不同的方面。

  • 在 Item 11 的代码片段中,Scott 展示了实现赋值运算符的一种方法。
  • 在第 12 条中,您提到的引用涉及避免赋值运算符和复制构造函数之间的代码重复。您的引文上方的一段说:



  • 我对 Item 12 的这部分的理解是这样的:如果你尝试编写如下内容(让复制赋值运算符调用复制构造函数)那么它会是错误的:
    PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
    : Customer(rhs),   // invoke base class copy ctor
      priority(rhs.priority)
    {
      logCall("PriorityCustomer copy constructor");
    }
    
    PriorityCustomer&
    PriorityCustomer::operator=(const PriorityCustomer& rhs)
    {
      logCall("PriorityCustomer copy assignment operator");
      this->PriorityCustomer(rhs); // This line is wrong!!!
      return *this;
    }
    

    10-04 21:18