我正在使用我的C ++(例如,试图进入更现代风格的编码)并且正在查看删除说明符。我的理解是,它用于确保无法定义或调用某些功能。如果我理解正确,这主要是在分配和复制的范围内。我不太清楚使用删除说明符和将这些函数设为私有之间有什么区别。
例如,有什么区别:
class Foo {
private:
Foo& operator(const Foo&);
Foo(const Foo&);
};
和
class Bar {
public:
Bar& operator(const Bar&) = delete;
Bar(const Bar&) = delete;
};
换句话说:使用删除说明符获得了什么?只是为了让事情看起来更好吗?
答案 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
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,祝你好运调试。