首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++函数返回函数

C++函数返回函数
EN

Stack Overflow用户
提问于 2015-07-13 15:18:32
回答 5查看 38K关注 0票数 35

在标准中,哪些函数不允许返回函数?我知道它们在概念上是荒谬的,但在我看来,语法允许它们。根据这个网页,一个"noptr-声明器[是]任何有效的声明器。“将包括一个函数的声明器:

代码语言:javascript
复制
int f()();

关于语法的.

在我看来,dcl.decl中的语法允许

代码语言:javascript
复制
int f(char)(double)

它可以解释为函数f,它接受一个char并返回一个与int g(double)具有相同签名的函数。

代码语言:javascript
复制
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 -操作符,然后,使用4->5,5=7,7->8作为第一个声明符;使用4->5,5=7,7->9作为第二个和第三个声明器。

EN

回答 5

Stack Overflow用户

发布于 2020-08-27 16:23:29

代码语言:javascript
复制
using namespace std;

auto hello()
{
    char name[] = "asdf";
    return [&]() -> void
    {
        printf("%s\n", name);
    };
}

int main()
{
    hello()();
    auto r = hello();
    r();
    return 0;
}
票数 4
EN

Stack Overflow用户

发布于 2015-07-13 15:23:05

C的形式语法实际上不允许返回函数,但是,人们总是可以返回函数指针,从所有意图和目的来看,它似乎都是您想要做的:

代码语言:javascript
复制
  int (*getFunc())(int, int) { … }

我一心一意地说,语法,是对这种特征缺乏支持的一个更根本的解释。标准的规则是后一个问题。

如果语法没有提供完成某件事情的方法,我认为对于任何上下文无关的语言来说,语义或标准说什么并不重要。

票数 0
EN

Stack Overflow用户

发布于 2015-07-13 15:47:30

实际上,在C中,不能传递或返回函数。只能传递/返回函数的指针/地址,这在概念上是非常接近的。老实说,由于函数指针可能包含&*,所以人们不应该真正关心函数或指针是否被传递(除非它包含任何静态数据)。下面是简单的函数指针声明:

代码语言:javascript
复制
void (*foo)();

foo是指向函数的指针,返回空且不接受参数。

在C++中,这并没有太大的不同。对于所有可调用的创建,仍然可以使用C样式的函数指针或新的有用的std::function对象。C++还添加了lambda表达式,它们是内联函数,在某种程度上类似于函数语言中的闭包。它允许您不使所有传递的函数都是全局的。

最后,返回函数指针或std::function可能看起来很可笑,但实际上并非如此。例如,状态机模式(在大多数情况下)是基于返回指向函数的指针来处理下一个状态或可调用的下一个状态对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31387238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档