【发布时间】:2015-10-01 22:42:02
【问题描述】:
标准中哪些地方不允许函数返回函数?我知道它们在概念上很荒谬,但在我看来,语法允许它们。根据此网页,“noptr-declarator [is] any valid declarator”将包含函数声明符:
int f()();
关于语法。
在我看来,如 [dcl.decl] 中所述的语法允许
int f(char)(double)
可以解释为函数 f 接受一个 char 并返回一个与 @987654326签名相同的函数@。
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。
【问题讨论】:
-
这真是糟糕的建议。即使在 C 中,您也可以返回函数指针。在 C++ 中,您可以使用 std::function 或任何可调用对象。
-
@maja:那不返回函数。它返回一个函数指针。
-
您错误地认为 C++ 主要由语法定义。语法意义不大(众所周知,它对 C++ 来说非常模棱两可;这就是为什么编写 C++ 解析器非常困难,阅读 C++ 代码也是如此!)
-
我最终否决了这个问题,因为它混合了 grammar 和 language 定义,这对于 C++ 来说(遗憾的是恕我直言)是非常不同的。这就是为什么 C++ 如此难以阅读、难以学习、难以解析(所有这一切都是因为 legacy 和 与 C 的向后外观兼容性 的原因)
-
函数返回函数在概念上没有什么可笑的。它一直用其他语言完成。它甚至在 C++ 中以函数返回闭包的形式完成。
标签: c++ c++11 standards language-lawyer