Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回抽象类的函数签名_C++_Abstract Class_Language Lawyer_Signature - Fatal编程技术网

C++ 返回抽象类的函数签名

C++ 返回抽象类的函数签名,c++,abstract-class,language-lawyer,signature,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很好地编译了这一点 我试图用谷歌搜索这个问题,但没有找到任何有用的东西。这个代码符合标准吗?如果不是,那么禁止声明

考虑一些抽象类
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
很好地编译了这一点

我试图用谷歌搜索这个问题,但没有找到任何有用的东西。这个代码符合标准吗?如果不是,那么禁止声明此类签名类型的原因是什么?我认为仅仅是一个声明没有任何问题

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

对于那些对这种声明的有用性感兴趣的人:我有一些工厂容器,它在添加新工厂以了解新工厂时使用签名,如
接口(参数…
;实际返回的类型是基于一个单独的traits类确定的,该类由
接口
参数化


显然,我可以将
接口
与签名分开,但它看起来并没有那么好:(

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

这个代码符合标准吗

否。根据C++11[class.abstract]/3,“抽象类不得用作参数类型、函数返回类型或显式转换类型。”

如果不是,那么禁止声明此类签名类型的原因是什么

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

我认为仅仅是一个声明没有任何问题

事实上,仅仅一个声明是无害的,但它也有些无用;它不会引用任何可能存在的类型


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

我不想创建
a
类型的对象,也不想从函数返回它。我只想声明一个返回此类型的签名。@lisyarus希望您返回一个指向基类的指针或引用,而不是通过值,否则您将返回派生类。我很想知道为什么我在这个问题上投了反对票…(我没有投反对票就给出了更糟糕的答案;)@tobi303我问了关于声明函数签名类型的问题。既不是关于使用此签名的实际函数,也不是关于创建抽象类的对象。因此,我认为这个答案与这个问题无关。
我认为仅仅声明没有任何问题。
好的。但是你能看到这样的声明有什么用处吗?@user2079303在问题中包含了我的用例。我在问题中包含了我面临的一个用例。这样一个函数不存在的事实并不禁止在某些模板元编程中使用这种类型。