如果我理解正确,抽象类型不能用作纯虚拟函数的返回类型。但是,如果使用尾随返回类型,那么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
--结束示例]
纯虚拟函数似乎没有任何特殊的例外。因此,答案似乎是编译器需要为代码发布诊断。