【问题标题】:Can abstract types be used as the return type of a pure virtual function?抽象类型用作纯虚拟功能的返回类型吗?
【发布时间】:2020-11-19 11:40:54
【问题描述】:

如果我理解正确,抽象类型不能用作纯虚函数的返回类型。但是,如果使用尾随返回类型,则 gcc(但不是 clang)接受以下代码:

struct S {
    virtual auto f() -> S = 0; 
};

demo.

这是一个 gcc 错误,还是该语言不需要为此代码发出诊断?

【问题讨论】:

  • 无论这是否格式错误,都无法覆盖该函数。
  • @eerorika 为什么会这样?如果f 返回了S*,那么它将是可覆盖的,是吗?
  • @cigien 是的。问题在于返回S 按值。由于S 是抽象的,因此无法实例化返回值。通过指针或引用返回 S 很好。
  • 啊,所以问题是返回类型。我明白了,这段代码是错误的。所以问题仍然存在,编译器是否有义务对此进行诊断,还是我应该更好地了解?
  • @cigien gcc DOES NOT accept the code,它确实会生成诊断信息,至少在尝试覆盖 f() 的派生类型上,无论如何:“错误:成员函数的抽象返回类型无效......因为以下虚函数在 'S' 中是纯函数...“错误:无效的抽象返回类型”

标签: c++ language-lawyer pure-virtual trailing-return-type


【解决方案1】:

根据C++17 [class.abstract]/3,抽象类型不能作为任何函数的返回类型:

抽象类不得用作参数类型、函数返回类型或显式转换的类型。可以声明对抽象类的指针和引用。 [ 例子:

shape x;           // error: object of abstract class
shape* p;          // OK
shape f();         // error
void g(shape);     // error
shape& h(shape&);  // OK

结束示例 ]

对于纯虚函数似乎没有什么特别的例外。因此,答案似乎是编译器需要为您的代码发出诊断。

【讨论】:

  • 澄清一下,“不应...”意味着应该发出诊断信息?
  • @cigien 是的。请参阅 [intro.compliance]/1:“可诊断规则集 包含本文档中的所有句法和语义规则,但那些包含“不需要诊断”的明确表示法或被描述为导致“未定义的行为”。”
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多