有一个返回抽象类型合法的函数头?

Gui*_*cot 8 c++ abstract-class language-lawyer c++11

我想知道根据C++标准,以下是合法的:

struct Abstract { virtual ~Abstract() = 0; };

auto get_type() -> Abstract;

// I use `get_type` only to extract the return type.
using MyType = decltype(get_type());
Run Code Online (Sandbox Code Playgroud)

GCC 6.3接受了它,但Clang 3.9拒绝了它.

但是,如果我这样做:

auto get_type() -> struct Abstract;

struct Abstract { virtual ~Abstract() = 0; };

using MyType = decltype(get_type());
Run Code Online (Sandbox Code Playgroud)

现在两个编译器都接受它.在这种情况下他们都错了吗?

Bar*_*rry 10

在[class.abstract]中,非常简单:

抽象类不能用作参数类型,函数返回类型或显式转换的类型.

试图做这种事情的任何代码都是格式错误的.