我正在研究最棘手的解析问题,然后我偶然发现了类似这样的东西:
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)
的典型语法非常不同。这些括号是参数列表的括号,还是名称的括号?
我正在研究最棘手的解析问题,然后我偶然发现了类似这样的东西:
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)
的典型语法非常不同。这些括号是参数列表的括号,还是名称的括号?
完整显式形式:
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 *
。
bar
的参数列表:Foo bar(Baz());
^ ^
Baz()
是一个函数类型。函数类型声明中的括号限定了该函数的参数列表。Foo bar(Baz());
^^
澄清一下:在函数参数声明符的上下文中,函数类型被调整为该类型的一个函数指针。因此,声明实际上等同于:
Foo bar(Baz(*)());
^ ^
Foo bar(Baz());
声明一个接受单个参数的函数,该参数是一种返回Baz
且不接受参数的函数类型。
这等同于一个函数声明,该函数接受单个参数,该参数是一个返回Baz
且不接受参数的函数指针类型(来自函数):
根据以下规则确定参数列表中每个函数参数的类型:
...
3) 如果类型是函数类型 F,则用“指向 F 的指针”类型替换它
...
Baz
是一个不带参数返回Foo
的函数,那么这将声明bar
为类型为Foo
的变量,并初始化为Baz()
。但是如果Baz
是一个类型,则bar
被声明为函数?!太疯狂了... - Ray Toal