正确格式化代码有助于您理解:
template <class T>
class tmp {
public:
int i;
};
auto foo() -> auto(*)() -> tmp<int>(*)() {
return 0;
}
template <class T>
class tmp{
public:
int i;
};
tmp<int> (*
( *foo() )()
)() {
return 0;
}
template class
部分保持不变,因此我不打算对其进行详细说明。我们来看看函数
foo
。
在第一段代码中,
foo()
的返回值为
auto(*)() -> tmp<int>(*)()
,它是指向返回另一个指针的函数的指针,该指针又指向返回
tmp<int>
的函数。
正如您总是可以像这样定义一个函数指针:
base_type_t (*pointer_name)(parameter_list);
递归使用函数(即
func_name()
)来定义一个返回指针的函数,可以声明
pointer_name
。
base_type_t (*func_name())(parameter_list);
~~~~~~~~~~~
所以现在(*func_name())(parameter_list)
可以用于另一个函数。让我们把它放回到函数指针定义语法中:
base_type_t (*(*func_name())(parameter_list))(parameter_list);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
清空参数列表(它们为空),并用正确的类型替换标识符,得到:
base_type_t (*(*func_name())(parameter_list))(parameter_list);
tmp<int> (*(* foo ())( ))( );
// Turns to
tmp<int> (*(*foo())())();
正如其他人所建议的,https://cdecl.org/ 是一个很好的代码分析器,但它可能会给出另一句话,不太容易理解。