如果我理解正确,抽象类型不能用作纯虚函数的返回类型。但是,如果使用尾随返回类型,则 gcc(但不是 clang)接受以下代码:
struct S {
virtual auto f() -> S = 0;
};
演示。
这是一个 gcc 错误,还是该语言不需要为此代码发布诊断?
如果我理解正确,抽象类型不能用作纯虚函数的返回类型。但是,如果使用尾随返回类型,则 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
—结束示例]
纯虚函数似乎没有任何特殊的例外。因此,答案似乎是编译器需要为您的代码发出诊断。