考虑一些抽象类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
与签名分开,但它不会让看起来很好:(
答案 0 :(得分:8)
此代码是否符合标准?
没有。根据C ++ 11 [class.abstract] / 3,"抽象类不能用作参数类型,不能用作函数返回类型,或者用作显式类型。转换"
如果没有,那么禁止宣布这种签名类型的原因是什么?
该签名的功能不存在,因为它必须在返回时创建抽象类类型的对象。
我只是在宣言中看不到任何问题。
事实上,只是声明是无害的。但它也有点无用;它不会引用任何可能存在的类型。
对于您的用例,您可以使用引用或指针作为返回类型。
答案 1 :(得分:0)
您无法根据定义创建抽象类的对象。因此,返回抽象对象的函数没有意义。如果你仍想以某种方式返回A
,你必须返回一个指针(实际上它必须指向一个具体子类的对象)。