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

时间:2017-03-09 17:13:19

标签: c++ c++11

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

例如,有什么区别:

 class Foo {
 private:
      Foo& operator(const Foo&);
      Foo(const Foo&);     
 };

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

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

3 个答案:

答案 0 :(得分:4)

一个明显的区别是,如果你将这个功能设为私有,那么它仍然可以在课堂和任何朋友中访问。

明确删除的功能在任何地方都无法使用,因此您只需从该行中知道它从未使用过,而无需检查实现。

您可以将该功能设为私有和已删除:然后它对重载决策的参与更加一致。

答案 1 :(得分:1)

简短回答是:使用已删除的函数会使程序格式错误,并在编译时通知您,未使用未定义的函数结束于链接器发出的奇怪错误。

作为一个例子,标准的相关部分表明:

  

除了声明它之外,隐式或显式引用已删除函数的程序是不正确的。

因此,以下compiles just fine

pay range

₦5,000 - ₦10,000
₦5,000 - ₦10,000
₦5,000 - ₦10,000
₦40,000 and above
₦5,000 - ₦10,000
₦5,000 - ₦10,000
₦5,000 - ₦10,000
₦5,000 - ₦10,000
₦21,000 - ₦30,000
₦11,000 - ₦20,000
₦11,000 - ₦20,000
₦5,000 - ₦10,000
₦11,000 - ₦20,000

the code below does not

struct S {
    void f();
};

template<typename T, void (T::*M)() = &T::f>
void g() {}

int main() {
    g<S>();
}

这是因为在第二种情况下代码格式不正确,无论你是否打算使用struct S { void f() = delete; }; template<typename T, void (T::*M)() = &T::f> void g() {} int main() { g<S>(); } ,你都会遇到编译时错误。在第二种情况下,只有在尝试使用链接器时才会从链接器中获得错误:

M

当然,编译时错误要好得多,以防止出现问题。该示例使用公共函数,但将它们设为私有不会阻止在类中以类似方式使用它们。这只是一个展示可能差异的玩具示例。

答案 2 :(得分:1)

这更简单。

这样,您的意图就明确了,您的编译器可以直接说“禁止调用此函数”。

否则你依赖:

  • 访问控制(对于来自课外的尝试来电)或
  • 链接器在构建过程结束时为您提供“未定义的引用”。这对于可以快速找到正在发生的事情的小程序来说是好的,但是对于深层次的层次结构,其中一些多次封装的对象无法复制但是没有availableHeats d,祝你好运调试。