奇怪的函数语法:auto(* f3)(int n) - > int(*)[n];

时间:2015-10-02 16:54:59

标签: c++

我遇到了这种奇怪的函数语法:

const int n = 3;

auto (*f3)(int n)->int (*)[n]; //error: parameter 'n' as array bound

在cppreference.com上阅读this page的范围时。

虽然第二个陈述是错误的,但你如何解释呢? (假设范围错误已得到纠正)

我认为第一部分是指向函数的指针,但它的部分来自于 - >那些让我难过的东西。

有人能指出我正确的方向吗?感谢

2 个答案:

答案 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个整数的数组的指针。