为什么我不能用`= delete;`来声明一个纯虚函数?

时间:2014-07-25 14:38:22

标签: c++ c++11

简介

纯虚函数与常用语法相关:

virtual f() = 0; 

然而,由于c ++ 11,有一种方法可以传达(特殊)成员函数的显式non existence

Mystruct() = delete; // eg default constructor

Q

为什么这种语法不能扩展到纯虚函数,以实现通信这种操作的一致性? :

virtual f() = delete; 

注意

我知道明显的答案是because the Standard says so!。我想知道这背后的原因以及是否有这样的建议(或意图)。

4 个答案:

答案 0 :(得分:7)

= delete;意味着与使函数纯虚拟完全不同。与删除的函数不同,纯虚函数不会使一个错误的程序选择它作为重载解析的结果。

答案 1 :(得分:6)

粗略地说,不同之处在于:

virtual void f() = 0; 

说"这个类是抽象,我可能没有写过这个成员函数的实现" (虽然你被允许)。

但是,这个:

void f() = delete;

说"这个成员函数字面上不存在, none将传递。"

答案 2 :(得分:4)

这两件事的意义有很大不同。粗略地说,区别在于:

virtual void f() = 0; 

说“我还没有写过这个函数的实现。”

但是这个:

f() = delete;

说“注意编译器:不要创建此函数的实现。”

答案 3 :(得分:1)

有一些自动生成的成员函数:默认构造函数,析构函数,复制构造函数,赋值,还有一些新的移动构造函数。

能够delete它们的目的是确保编译器不允许调用它们。老技巧是声明它们private而不给它们实现。

这很麻烦,但显然它没有完全阻止将它们称为友元类(甚至类本身)可能会意外地调用副本或赋值,虽然你会得到一个链接器错误,但它并不理想你无法看到错误的位置,而且你真的想要编译错误。

使用=0将函数声明为虚拟函数不会阻止它被调用。它具有特殊的意义,使您的类抽象,因此您无法创建实例,并且意味着该函数不需要实现,但它具有与删除它不同的含义。