为什么 g++ 将函数报告为具有 int ()() 类型

Why does g++ report a function as having type int ()()?

本文关键字:int 类型 g++ 函数 报告 为什么      更新时间:2023-10-16
$ cat -n cons.cpp
     1  #include <iostream>
     2
     3  using namespace std;
     4
     5  int return1() {
     6      return 1;
     7  }
     8
     9  int main() {
    10      cout<< return1.m_one << endl;
    11      return 0;
    12  }
$ g++ cons.cpp
cons.cpp: In function 'int main()':
cons.cpp:10: error: request for member 'm_one' in 'return1',
             which is of non-class type 'int ()()'
$

也许这是特定于编译器的,但是上面 g++ 报告的 int ()() 中额外的一对括号是否有一些意义/含义?

这个语法的思想是这样的:

  • 内括号表示我是一个函数
  • 左侧的int表示我的返回类型为 int
  • 正确的一对括号意味着我没有争论

因此,如果该函数已声明为

int return1(int a)

错误消息将谈论int ()(int)

但是函数类型的表示方式确实取决于编译器和版本。 例如,我刚刚尝试的GCC 4.5.1只是简单地说int(),正如您建议的那样更直观。

函数指针将int (*)()int ()()不是合法语法,但我可以看到一个漂亮的打印机如何为函数类型输出它。

如果此语法是合法的,则作为类型声明符的实际含义是:

   function taking no arguments
    ↓↓
int ()()
↑↑↑   ↑↑
  and returning int(), i.e. a function that takes no argument and returns int.

但在 C 和 C++ 中,函数被禁止直接返回函数,而是必须返回指向函数的指针。同样,您不能直接返回数组(int ()[10](

函数类型的实际拼写方式没有这些括号集之一。例如,当声明std::function的参数和返回值时,这是合法

               ↓↓↓↓↓
std::function< int() > foo = []() -> int { return 1; };

在启用 C++11 的编译器上,错误消息中的int()()表示"可调用元素(第一个()(不带任何参数(第二个()(返回 int.(C++03 和 C99 函数指针(如 int(*)() 是自引用的,并且调用 int(*((( 或 int(&((( 是相同的,因此需要统一消息(

这就是return1实际含义(函数指针或引用(。由于int不是"复合类型",编译器抱怨.和下面的成员