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

Nik*_*iou 5 c++ c++11

介绍

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

virtual f() = 0; 
Run Code Online (Sandbox Code Playgroud)

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

Mystruct() = delete; // eg default constructor
Run Code Online (Sandbox Code Playgroud)

Q

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

virtual f() = delete; 
Run Code Online (Sandbox Code Playgroud)

注意

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

R. *_*des 7

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

  • `abstract_class*a = new derived_class; A-> pure_virtual_function();` (4认同)
  • @NikosAthanasiou:动态调度在运行时发生,基于当时实际使用的对象.重载解析在编译时发生. (4认同)

Edw*_*ard 7

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

virtual void f() = 0; 
Run Code Online (Sandbox Code Playgroud)

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

然而这个:

f() = delete;
Run Code Online (Sandbox Code Playgroud)

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

  • 后者说得更多!它还说“如果你发现我试图使用它,惩罚我,因为我是一个非常顽皮的男孩”。 (7认同)
  • @R.MartinhoFernandes,你又裸体了吗? (5认同)
  • 前者完全不是这个意思。为纯虚函数生成定义是完全有效的。请参阅我对_真相_的回答。 (2认同)
  • @Edward:好吧,如果“传达一个粗略的近似”你的意思是“传播一种危险和流行的误解”,那么你做得很好!相反,通过说实话来帮助理解;通过讲述非事实,你实际上是在_伤害_理解(这应该是不言而喻的)。 (2认同)

Lig*_*ica 6

粗略地说,区别在于:

virtual void f() = 0; 
Run Code Online (Sandbox Code Playgroud)

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

但是,这个:

void f() = delete;
Run Code Online (Sandbox Code Playgroud)

说"这个成员函数字面上不存在,任何一个都不会通过."

  • @Logicrat:它对复制构造函数等很有用.如果您根本没有声明复制构造函数,那么在某些情况下,会为您声明一个.您必须将其标记为"private"以防止其使用,然后编译错误并不十分清楚._` = delete`记录意图并改进诊断._ (2认同)