C++ 11删除说明符与私有函数的使用

bas*_*sil 6 c++ c++11

我正在篡改我的C++(例如,尝试进入更现代风格的编码)并且正在查看删除说明符.我的理解是,它用于确保无法定义或调用某些功能.如果我理解正确,这主要是在分配和复制的范围内.我不太确定使用删除说明符和将这些函数设为私有之间的区别.

例如,有什么区别:

 class Foo {
 private:
      Foo& operator(const Foo&);
      Foo(const Foo&);     
 };
Run Code Online (Sandbox Code Playgroud)

 class Bar {
 public:
      Bar& operator(const Bar&) = delete;
      Bar(const Bar&) = delete;
 };
Run Code Online (Sandbox Code Playgroud)

换句话说:使用删除说明符获得了什么?只是让事情看起来更好吗?

Tob*_*ght 4

一个明显的区别是,如果您将函数设为私有,那么仍然可以从班级内部和任何朋友访问它。

显式删除的函数在任何地方都不可用,因此您只需从这一行就知道它从未使用过,而无需检查实现。

您可以将函数设置为私有和删除:这样它对重载决策的参与就更加一致。

  • 我同意前两个陈述,但我会公开删除的函数。引用 Scott Meyers 的《Effective Modern C++》:“当客户端代码尝试使用成员函数时,C++ 在删除状态之前检查可访问性。当客户端代码尝试使用已删除的私有函数时,一些编译器只会抱怨该函数是私有的,即使该函数的可访问性并不真正影响它是否可以使用。 (7认同)