抽象类型可以用作纯虚拟函数的返回类型吗



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

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

演示。

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

根据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

--结束示例]

纯虚拟函数似乎没有任何特殊的例外。因此,答案似乎是编译器需要为代码发布诊断。

相关内容

最新更新