繁体   English   中英

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

[英]C++11 usage of delete specifier vs private functions

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

例如,有什么区别:

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

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

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

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

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

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

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


例如,标准的相关部分指出:

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

因此,以下编译就好了

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 ,你都会遇到编译时错误。 在第二种情况下,只有在尝试使用链接器时才会从链接器中获得错误:

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

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

它更简单。

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

否则你依赖于:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM