[英]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.