c++11=虚拟函数上用于指定默认纯实现的默认关键字



我很好奇为什么在C++11中,在派生的虚拟方法上使用"=default"不能选择纯基类实现。

例如,以下测试代码从"g++-std=c++11"中生成消息"error:'virtual void B::tst()'cannot be default"。

struct A {
  virtual ~A () = default;
  virtual void tst () = 0;
};
void A :: tst () {}
struct B : public A {
  virtual void tst () = default;
};

当然,我们可以提供一个调用默认基本实现的B::tst,但人们担心,与假设的基于"=default"的编码相比,这可能是更高的开销实现。

很抱歉问一些关于c++标准委员会人员可能会想到什么或可能不会想到什么的问题,但尽管如此,也许栈溢出的某个人会有一些智慧,认为以这种方式使用默认关键字是不切实际的,这会很有意思。

谢谢!

根据标准§8.4.2/p1显式默认函数[dcl.fct.def.default]Emphasis Mine):

表单的函数定义:

attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt = default;

称为显式默认定义。一个函数应明确违约

(1.1)--是一个特殊的成员函数,

(1.2)-具有相同的声明函数类型(除了可能不同的ref限定符和在复制构造函数或复制赋值运算符的情况下,参数类型可以是"引用非常数T",其中T是成员函数类的名称),就好像它是隐式声明的一样,和

(1.3)--没有默认参数

成员函数tst()不是一个特殊的成员函数。因此,它不能被默认。

现在,将一个类(例如class A)的成员函数指定为纯虚拟,意味着从该类继承的任何类(您不希望它也是抽象的)都必须覆盖该成员函数。

最新更新