标准中哪里禁止返回函数?我理解它们在概念上是荒谬的,但是在我看来语法允许它们。根据此网页,“ noptr-declarator [is] any valid declarator”将包含函数的声明符:
int f()();
关于语法。
在我看来,[dcl.decl]中阐明的语法允许
int f(char)(double)
可以解释为函数f
需要一个char
并返回具有与 int g(double)
相同签名的函数。
1 declarator:
2 ptr-declarator
3 noptr-declarator parameters-and-qualifiers trailing-return-type
4 ptr-declarator:
5 noptr-declarator
6 ptr-operator ptr-declarator
7 noptr-declarator:
8 declarator-id attribute-specifier-seq opt
9 noptr-declarator parameters-and-qualifiers
10 noptr-declarator [ constant-expression opt ] attribute-specifier-seq opt
11 ( ptr-declarator )
12 parameters-and-qualifiers:
13 ( parameter-declaration-clause ) cv-qualifier-seqAfter
大致来说,1-> 2,2 = 4,4-> 6,4-> 6你应该有ptr-operator ptr-operator ptr-operator然后,对第一个声明符使用4-> 5,5 = 7,7-> 8;第二和第三个声明符使用4-> 5,5 = 7,7-> 9。
从[dcl.fct],非常明显:
函数不得具有数组或函数的返回类型],尽管它们可能具有以下返回类型:输入指针或对此类事物的引用。尽管可以有数组,但不应有函数数组指向函数的指针。
使用C ++ 11,您可能只想要:
。这是一个解析树:std::function<int()> f(); std::function<int(double)> f(char);
关于C ++语法有些困惑。根据语法分析语句
int f(char)(double);
can
此外,基于[dcl.fct] / 1,这样的解析甚至是有意义的:
的类型是“(char)返回int的函数”。因此derived-declarator-type-list是“(字符)返回的函数”。因此,在声明
)cv-qualifier-seq optref-qualifier opt exception-specification opt attribute-specifier-seq opt并且声明T D
中,其中D
的格式为D1
(parameter-declaration-clauseT D1
中包含的declarator-id的类型为“ derived-declarator-type-listT
”,D
中declarator-id的类型是“ declared-declarator-type-list函数的功能(parameter-declaration-clause)cv-qualifier-seq < [选择ref-qualifier opt返回T
”。在此示例中为T == int
,D == f(char)(double)
,D1 == f(char)
。T D1
(int f(char)
)中的declarator-id
f
的类型将被理解为“(char)返回函数(double)返回int的函数。”最终什么也没做,因为这是明确禁止的声明器形式。但不是语法。 std::function
对象。 C ++还添加了lambda expressions,它们是内联函数,在某种程度上类似于功能语言中的闭包。它允许您不要使所有传递的函数成为全局函数。最后,返回函数指针或std::function
似乎很荒谬,但实际上并非如此。例如,状态机模式(在大多数情况下)基于返回指向处理下一个状态或可调用的下一个状态对象的函数的指针。
#define def auto