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

Why can't I declare a pure virtual function with `= delete;`?

本文关键字:一个 函数 声明 不能 为什么 delete      更新时间:2023-10-16

简介

纯虚拟函数使用通用语法进行建模:

virtual f() = 0; 

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

Mystruct() = delete; // eg default constructor

Q

为什么不将这种语法扩展到纯虚拟函数,以便在通信此类操作时实现一致性?:

virtual f() = delete; 

备注

我知道显而易见的答案是because the Standard says so!。我想知道这背后的原因,以及是否有这样的提议(或意图(。

粗略地说,区别在于:

virtual void f() = 0; 

说"这个类是抽象的,我可能还没有编写这个成员函数的实现"(尽管允许您这样做(。

然而,这:

void f() = delete;

说"这个成员函数实际上不存在,没有一个通过。">

= delete;的意思与使函数成为纯虚拟函数完全不同。与已删除的函数不同,纯虚拟函数不会使选择它作为过载解决结果的程序格式不正确。

这两件事的含义有很大的不同。粗略地说,不同之处在于:

virtual void f() = 0; 

说";我可能还没有编写这个函数的实现">

然而:

f() = delete;

说";编译器注意:不要创建此函数的实现">

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

能够delete它们的目的是确保编译器不允许调用它们。老把戏是将它们声明为private,而不给它们一个实现。

这很麻烦,但值得注意的是,它并没有完全阻止调用它们,因为朋友类(甚至类本身(可能会意外调用副本或赋值,尽管你会遇到链接器错误,但这并不理想,因为你看不到错误在哪里,而且你真的想要一个编译器错误。

=0将函数声明为虚拟函数不会阻止调用该函数。它有一个特殊的意义,使你的类抽象,所以你不能创建一个实例,这意味着该函数不需要实现,但它有不同于删除它的意义。