在 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/