先看一个极其复杂的函数声明:c++
std::string (*(*returnFunction(std::string (*(*pf)(std::initializer_list<std::string> list))[5]))(std::initializer_list<std::string> list))[5];
特别长,一页几乎不能显示彻底。
而后看其函数名,参数类型,及返回类型。几乎也是彻底看不出分别是什么。web
若是换一种表达方式:数组
auto returnFunction(std::string (*(*pf)(std::initializer_list<std::string> list))[5]) -> std::string (*(*)(std::initializer_list<std::string> list))[5];
这样能一眼看出返回值类型了,还有函数名。参数列表也能看清楚了。svg
不过这种表示仍是不太直观。函数
再换一种表达方式呢?spa
using pm = std::string (*(*)(std::initializer_list<std::string> list))[5]; pm returnMethod(pm from);
这种是否是就很是清晰了。就算彻底不懂 c++ ,也知道这个函数声明表达的是什么了。指针
还有一种传统的简化方式。code
typedef std::string (*(*ptm)(std::initializer_list<std::string> list))[5]; ptm returnTypeMethod(ptm from);
以上4种,实际上是彻底相同的函数描述。返回类型,参数列表都是彻底相同的。xml
3,4是很是简单易懂的。不过如今只是直到这个函数的参数类型与返回值类型相同,还不知道这个参数类型或者说返回值类型,究竟是什么类型。对象
那就先看这个东西是什么: std::string (*(*ptm)(std::initializer_list<std::string> list))[5]
。
ptm
是一个指针(*ptm)
后面有参数列表,因此 *ptm
是一个函数综合:ptm
是一个函数指针。指向的是一个函数,其参数是一个 initializer_list
类型的对象,其返回值是一个指针,该指针指向的是一个长度为5,元素为 string 类型的数组。
那么,上面定义的函数就是这么一个函数,参数与返回值都是 ptm
类型的。