4

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

int (&a())[2];

那究竟是在宣布什么?&的作用是什么?为了增加我的困惑,如果我改为声明以下内容

int b()[2];

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

a = a;

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

4

3 回答 3

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 不返回。

于 2009-06-21T17:18:03.923 回答
8

为了将来参考,当您有一个特别难以破译的 C/C++ 声明时,您可能会发现此链接很有帮助:

如何阅读 C 声明

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

int (&a())[2];

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

int b()[2];

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

希望这可以帮助。

于 2009-06-21T17:26:56.097 回答
2
int (&a())[2];

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

 int b()[2];

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

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

于 2009-06-21T17:20:18.540 回答