首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中未命名函数指针的语法

C++中未命名函数指针的语法
EN

Stack Overflow用户
提问于 2018-09-30 20:36:00
回答 3查看 1.2K关注 0票数 14

我正在研究最令人烦恼的解析,我偶然发现了这样的东西:

代码语言:javascript
复制
Foo bar(Baz()); // bar is a function that takes a pointer to a function that returns a Baz and returns a Foo

这与return-type(*name)(parameters)的典型语法有很大不同。括号是表示参数列表的括号,还是表示名称?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-30 20:46:29

完全明确的形式:

代码语言:javascript
复制
Foo bar(Baz f());

bar是一个接受单个参数f的函数,它是一个返回Baz的函数(不带参数)。

而不命名参数:

代码语言:javascript
复制
Foo bar(Baz ());

bar最终接受指向函数的指针的原因是函数不能通过值传递,因此将参数声明为函数会自动将其分解为指针。上述声明相当于:

代码语言:javascript
复制
Foo bar(Baz (*)());

// or:
Foo bar(Baz (*f)());  // with a named parameter

这与void foo(int [10])类似,其中int [10]在参数列表中也表示int *

票数 17
EN

Stack Overflow用户

发布于 2018-09-30 20:48:33

声明中有两组括号。括号的外部集合是函数bar的参数列表。

代码语言:javascript
复制
Foo bar(Baz());
       ^     ^

这个声明中的Baz()是一个函数类型。函数类型声明中的括号分隔该函数的参数列表。

代码语言:javascript
复制
Foo bar(Baz());
           ^^

为了澄清:在函数参数声明器的上下文中,函数类型被调整为指向该类型函数的指针。因此,该声明实际上相当于:

代码语言:javascript
复制
Foo bar(Baz(*)());
           ^ ^

此替代指针参数声明器的突出显示的括号不在“预调整”声明中。

相关标准规则:

dcl.fct 函数的类型使用下列规则确定。每个参数的类型(包括函数参数包)由它自己的decl-说明符-seq和声明器确定。在确定每个参数的类型之后,任何类型为“T数组”或函数类型T的参数都被调整为“指向T的指针”。..。

票数 6
EN

Stack Overflow用户

发布于 2018-09-30 20:48:16

括号是表示参数列表的括号,还是表示名称?

它们用于参数列表。

所以:

代码语言:javascript
复制
Foo bar(Baz());

声明一个函数,该函数接受返回Baz的类型函数的单个参数,而不接受任何参数。

这依次等于一个函数声明,该声明接受指向返回Baz而不接受参数的函数的类型指针的单个参数。as (来自函数):

参数列表中每个函数参数的类型根据以下规则确定: ..。 3)如果类型是函数类型F,则将其替换为“指向F的指针”类型。 ..。

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

https://stackoverflow.com/questions/52581933

复制
相关文章

相似问题

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