函数声明后的= delete的含义
class my_class { ... my_class(my_class const &) = delete; ... };
在这种情况下, = delete
是什么意思?
还有没有其他的“修饰符”(除了= 0
和= delete
)?
删除一个函数是一个C ++ 11function :
现在可以直接expression“禁止复制”的常用成语:
class X { // ... X& operator=(const X&) = delete; // Disallow copying X(const X&) = delete; };
[…]
“删除”机制可以用于任何function。 例如,我们可以消除不希望的转换,如下所示:
struct Z { // ... Z(long long); // can initialize with an long long Z(long) = delete; // but not anything less };
-
= 0
意味着一个函数是纯虚拟的,你不能从这个类实例化一个对象。 你需要从中派生出来并实现这个方法 -
= delete
意味着编译器不会为你生成这些构造函数。 AFAIK这只允许复制构造函数和赋值运算符。 但是我对即将到来的标准不太了解。
= delete
是C ++ 11中的一个function介绍。 按照=delete
它将不被允许调用该函数。
详细。
假设在一个class级。
Class ABC{ Int d; Public: ABC& operator= (const ABC& obj) =delete { } };
当调用obj赋值这个函数时,它将不被允许。 意味着赋值运算符将限制从一个对象复制到另一个对象。
这是C ++ 0x标准中的新事物,您可以删除inheritance的函数。
新的C ++ 0x标准。 请参阅N3242工作草案中的第8.4.3节
本书摘自C ++编程语言[第4版] – Bjarne Stroustrup着作讲述了使用=delete
的真正目的 :
在层次结构中使用缺省副本或移动类通常是一个灾难 :只给出一个指向基的指针,我们不知道派生类具有什么成员(§3.2.2),所以我们不能知道如何复制它们 。 所以,最好的办法通常是删除默认的复制和移动操作,即消除这两个操作的默认定义:
class Shape { public: Shape(const Shape&) =delete; // no copy operations Shape& operator=(const Shape&) =delete; Shape(Shape&&) =delete; // no move operations Shape& operator=(Shape&&) =delete; ˜Shape(); // ... };
现在试图复制Shape将被编译器捕获。
=delete
机制是一般的,也就是说,它可以用来抑制任何操作