c – 如何在模板化的函数指针声明中读取这么多的星号和括号?
作者:互联网
参见英文答案 > Complex C declaration 7个
从Introduction to the C++11 feature: trailing return types开始
文章声称
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;
}
我不理解第二个代码示例中的复杂函数.我应该在一开始看哪里?我猜是foo.但foo旁边的统计数据将foo定义为指针……
基于第一个代码示例,我将把这个片段转换为
tmp<int> (*)() (*)() foo(){ return 0;}
所以foo是一个返回0的函数,但返回类型很棘手:它的返回类型是函数指针,其返回类型又是一个返回类型为tmp< int>的函数指针.
解决方法:
与@Vittorio答案相辅相成,有Clockwise Spiral Rule帮我们decypher复杂类型:
从未知元素开始,以螺旋/顺时针方向移动;当遇到以下元素时,用相应的英语语句替换它们:
> [X]或[]
Array
X
size of… or Array undefined size of…
>(type1,type2)
Function passing type1 and type2 returning…
> *
pointer(s) to…
继续以螺旋/顺时针方向执行此操作,直到所有令牌都被覆盖.始终先解决括号中的任何内容!
这里:
+-----------+
| +------+ |
| | >-v | |
temp<int> (*(*foo())())()
| | ^---+ | |
| ^--------+ |
+--------------+
foo是一个返回指向函数的指针的函数,该函数返回一个返回temp< int>的函数的指针.
现在,@ UKmonkey刚刚将此规则重命名为C Guru Snail Rule或简称CGSR:
/ /
L_L_
/ \
|00 | _______
|_/ | / ___ \
| | / / \ \
| |_____\ \_ / /
\ \____/ /_____
\ _______________/______\.............................
标签:c,c11,declaration,function-pointers 来源: https://codeday.me/bug/20190930/1835981.html