我正在研究最令人烦恼的解析,我偶然发现了这样的东西:
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)的典型语法有很大不同。括号是表示参数列表的括号,还是表示名称?
发布于 2018-09-30 20:46:29
完全明确的形式:
Foo bar(Baz f());bar是一个接受单个参数f的函数,它是一个返回Baz的函数(不带参数)。
而不命名参数:
Foo bar(Baz ());bar最终接受指向函数的指针的原因是函数不能通过值传递,因此将参数声明为函数会自动将其分解为指针。上述声明相当于:
Foo bar(Baz (*)());
// or:
Foo bar(Baz (*f)()); // with a named parameter这与void foo(int [10])类似,其中int [10]在参数列表中也表示int *。
发布于 2018-09-30 20:48:33
声明中有两组括号。括号的外部集合是函数bar的参数列表。
Foo bar(Baz());
^ ^这个声明中的Baz()是一个函数类型。函数类型声明中的括号分隔该函数的参数列表。
Foo bar(Baz());
^^为了澄清:在函数参数声明器的上下文中,函数类型被调整为指向该类型函数的指针。因此,该声明实际上相当于:
Foo bar(Baz(*)());
^ ^此替代指针参数声明器的突出显示的括号不在“预调整”声明中。
相关标准规则:
dcl.fct 函数的类型使用下列规则确定。每个参数的类型(包括函数参数包)由它自己的decl-说明符-seq和声明器确定。在确定每个参数的类型之后,任何类型为“T数组”或函数类型T的参数都被调整为“指向T的指针”。..。
发布于 2018-09-30 20:48:16
括号是表示参数列表的括号,还是表示名称?
它们用于参数列表。
所以:
Foo bar(Baz());声明一个函数,该函数接受返回Baz的类型函数的单个参数,而不接受任何参数。
这依次等于一个函数声明,该声明接受指向返回Baz而不接受参数的函数的类型指针的单个参数。as (来自函数):
参数列表中每个函数参数的类型根据以下规则确定: ..。 3)如果类型是函数类型F,则将其替换为“指向F的指针”类型。 ..。
https://stackoverflow.com/questions/52581933
复制相似问题