函数签名返回抽象类

lis*_*rus 3 c++ abstract-class signature language-lawyer

考虑一些抽象类A:

class A
{
    virtual void f() = 0;
};
Run Code Online (Sandbox Code Playgroud)

假设我希望声明一个返回此类的函数签名类型:

using Type = A();
Run Code Online (Sandbox Code Playgroud)

鉴于此代码,gcc-4.8.2错误导致错误

error: ‘type name’ declared as function returning an abstract class type
Run Code Online (Sandbox Code Playgroud)

clang-3.3 编译得很好.

我试图谷歌这个问题,但没有找到任何有用的东西.这段代码是否符合标准?如果没有,那么禁止宣布这种签名类型的原因是什么?我只是在声明中看不到任何问题.

免责声明:我打算创建这种类型的实例,我只想宣布描述的签名.

对于那些对这种声明有用的人感兴趣:我有一些工厂容器使用签名,就像Interface(Arguments...)添加新工厂来了解新工厂一样; 实际返回的类型是根据一个单独的traits类确定的,参数由Interface.

显然,我可以将其Interface与签名分开,但它看起来不会很好:(

Mik*_*our 8

这段代码是否符合标准?

根据C++ 11 [class.abstract]/3,"抽象类不能用作参数类型,作为函数返回类型,或作为显式转换的类型."

如果没有,那么禁止宣布这种签名类型的原因是什么?

该签名的功能不可能存在,因为它必须在返回时创建抽象类类型的对象.

我只是在声明中看不到任何问题.

实际上,只是声明是无害的.但它也有点无用; 它不会指任何可能存在的类型.

对于您的用例,您可以使用引用或指针作为返回类型.