抽象类型可以用作纯虚函数的 return 类型吗?

Can abstract types be used as the return type of a pure virtual function?

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

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

demo.

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

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

An abstract class shall not be used as a parameter type, as a function return type, or as the type of an explicit conversion. Pointers and references to an abstract class can be declared. [ Example:

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

end example ]

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