我遇到了这种奇怪的函数语法:
const int n = 3;
auto (*f3)(int n)->int (*)[n]; //error: parameter 'n' as array bound
在cppreference.com上阅读this page的范围时。
虽然第二个陈述是错误的,但你如何解释呢? (假设范围错误已得到纠正)
我认为第一部分是指向函数的指针,但它的部分来自于 - >那些让我难过的东西。
有人能指出我正确的方向吗?感谢
答案 0 :(得分:4)
带有->
的{{1}}语法和尾随返回类型是C ++ 11中的新增功能。您不能直接将内外声明解释规则应用于整个事物,只能应用于auto
左侧和->
右侧的单独部分。
如果我们摆脱错误
->
那么适当的等价物"经典"版本可以写成
const int n = 3;
auto (*f3)(int m) -> int (*)[n];
即。 const int n = 3;
typedef int (*T)[n];
T (*f3)(int m);
部分是返回类型。
换句话说
int (*)[n]
和
T (*f3)(int m);
是一回事。 auto (*f3)(int m) -> T;
有助于强调等效性。
答案 1 :(得分:3)
虽然第二个陈述是错误的,但你如何解释呢? (假设范围错误已得到纠正)
示例显示了btw 2个案例的区别:
const int n = 3;
int (*(*f2)(int n))[n];
基本上相当于:
const int n = 3;
int (*(*f2)(int n1))[n];
而
const int n = 3;
auto (*f3)(int n)->int (*)[n];
相当于:
const int n = 3;
auto (*f3)(int n1)->int (*)[n1];
和文章说明了原因。如果您的意思是通过以下方式修复此代码:
const int n = 3;
auto (*f3)(int n1)->int (*)[n];
然后它将声明一个指向函数的指针,该函数接受一个类型为int
的参数,并返回指向3个整数的数组的指针。