函数签名返回抽象类

时间:2015-05-07 11:57:59

标签: c++ abstract-class language-lawyer signature

考虑一些抽象类A

class A
{
    virtual void f() = 0;
};

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

using Type = A();

鉴于此代码,gcc-4.8.2错误

error: ‘type name’ declared as function returning an abstract class type

clang-3.3很好地编译了这个。

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

免责声明:我要创建此类型的实例,我只是对宣布所描述的签名感兴趣。

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

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

2 个答案:

答案 0 :(得分:8)

  

此代码是否符合标准?

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

  

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

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

  

我只是在宣言中看不到任何问题。

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

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

答案 1 :(得分:0)

您无法根据定义创建抽象类的对象。因此,返回抽象对象的函数没有意义。如果你仍想以某种方式返回A,你必须返回一个指针(实际上它必须指向一个具体子类的对象)。