这行是否声明了一个函数? C ++

时间:2009-06-21 17:12:41

标签: c++ function-declaration

我正在阅读litb关于SFINAE here的问题,我想知道他的代码究竟是什么声明。下面是一个更简单的(没有模板)示例:

int (&a())[2];

这究竟是什么声明? &amp ;?的作用是什么?为了增加我的困惑,如果我声明以下内容

int b()[2];

我收到一个关于声明一个返回数组的函数的错误,而第一行没有这样的错误(因此,人们会认为第一个声明是而不是一个函数)。但是,如果我尝试分配

a = a;

我收到一条错误消息,说我正在尝试分配函数...所以现在它一个函数。究竟是什么东西?

3 个答案:

答案 0 :(得分:17)

这些令人敬畏的程序称为cdecl和c ++ decl。它们非常有助于找出复杂的声明,特别是对于C和C ++用于函数指针的拜占庭形式。

tyler@kusari ~ $ c++decl
Type `help' or `?' for help
c++decl> explain int (&a())[2]
declare a as function returning reference to array 2 of int
c++decl> explain int b()[2]
declare b as function returning array 2 of int

a返回引用,b不返回。

答案 1 :(得分:8)

为了将来参考,当您有一个特别困难的C / C ++声明要解密时,您可能会发现此链接很有用:

How To Read C Declarations

为了完整起见,我会重复其他人所说的直接回答你的问题。

int (&a())[2];

...声明 a 是一个零参数函数,它返回对大小为2的整数数组的引用。(阅读上面链接的基本规则,以清楚地了解如何我想出了那个。)

int b()[2];

...声明 b 是一个零参数函数,它返回一个大小为2的整数数组。

希望这有帮助。

答案 2 :(得分:2)

int (&a())[2];

它声明了一个符号a,它是一个不带参数的函数,并返回对两元素整数数组的引用。

 int b()[2];

这声明了一个符号b,它是一个不带参数的函数,并返回一个两元素的整数数组......这是不可能的语言设计。

它相对简单:获取运算符优先级图表,启动符号名称(a)并开始应用运算符,如您所看到的优先级。在每次操作应用后记下。