我正在阅读litb关于SFINAE here的问题,我想知道他的代码究竟是什么声明。下面是一个更简单的(没有模板)示例:
int (&a())[2];
这究竟是什么声明? &amp ;?的作用是什么?为了增加我的困惑,如果我声明以下内容
int b()[2];
我收到一个关于声明一个返回数组的函数的错误,而第一行没有这样的错误(因此,人们会认为第一个声明是而不是一个函数)。但是,如果我尝试分配
a = a;
我收到一条错误消息,说我正在尝试分配函数...所以现在它是一个函数。究竟是什么东西?
答案 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 ++声明要解密时,您可能会发现此链接很有用:
为了完整起见,我会重复其他人所说的直接回答你的问题。
int (&a())[2];
...声明 a 是一个零参数函数,它返回对大小为2的整数数组的引用。(阅读上面链接的基本规则,以清楚地了解如何我想出了那个。)
int b()[2];
...声明 b 是一个零参数函数,它返回一个大小为2的整数数组。
希望这有帮助。
答案 2 :(得分:2)
int (&a())[2];
它声明了一个符号a
,它是一个不带参数的函数,并返回对两元素整数数组的引用。
int b()[2];
这声明了一个符号b
,它是一个不带参数的函数,并返回一个两元素的整数数组......这是不可能的语言设计。
它相对简单:获取运算符优先级图表,启动符号名称(a
)并开始应用运算符,如您所看到的优先级。在每次操作应用后记下。