c++ - 使类不可复制 : Private undefined methods vs Deleted methods

标签 c++ c++11 noncopyable

在 C++11 之前,我看到这样的代码:

class Car {
public:
  Car() {}
private:
  Car(const Car&);
  Car& operator=(const Car&);
};

对于 C++11(及更高版本),我看到这样的代码:

class Car {
public:
  Car() {}
private:
  Car(const Car&) = delete;
  Car& operator=(const Car&) = delete;
};

它们的行为是否相同?如果不是,请解释。

引用:https://ariya.io/2015/01/c-class-and-preventing-object-copy

最佳答案

它们在大多数方面相似,但在其他方面有所不同。

考虑以下试图复制类对象的外部代码:

int main() {
    Car c;
    Car other{c};
}

这两个版本都会导致上面的代码失败。不过,在这一点上,开发人员会查看界面以了解原因。对于 delete 版本,很明显 Car 不是要复制的。对于 private 版本,(至少没有注释),有人怀疑复制构造函数是否可能被意外放置在 private 部分。

现在考虑尝试复制类对象的成员代码:

void Car::foo() {
    Car c;
    Car other{c}; 
}

delete 版本像以前一样失败。 private 版本是链接错误。这引发了更大的疑问——忘记定义已声明的方法并不少见。也许这就是这里发生的事情? delete版本没有这个问题。

编辑 Scott Meyers 在 Effective Modern C++ 的第 11 项中对此进行了讨论优先删除函数而不是私有(private)未定义的函数

关于c++ - 使类不可复制 : Private undefined methods vs Deleted methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39888012/

相关文章:

c++ - 在 C++ 类之间共享实现

c++ - 做socket编程时,查找域名然后连接的正确方法是什么?

c++ - 制作一个 Mat 类型对象的数组。输出窗口显示相同的帧

C++后缀评估问题

c++ - 断言代码不编译

c++ - 使用 C++11 线程确保每个线程都有机会在给定时间段内执行

c++ - Boost::Regex 段错误(我认为)

c++ - boost 的虚拟析构函数 :noncopyable classes?

c++ - 如何将 vector (或不同的容器)与不可复制的类一起使用?

c++ - 如何判断一个c++类是否可复制