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

时间:2012-02-26 08:13:21

标签: c++ g++

$ 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 ()()中额外的括号对有一些意义/含义吗?

3 个答案:

答案 0 :(得分:5)

函数指针为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; };

答案 1 :(得分:5)

这种语法的想法是:

  • 内部括号对意味着我是一个功能
  • 左侧的int表示我的回复类型为int
  • 右对括号表示我不带参数

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

int return1(int a)

错误消息会谈到int ()(int)

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

答案 2 :(得分:1)

在启用了C ++ 11的编译器上,错误消息中的int()()表示“可调用元素(第一个())没有参数(第二个())返回int。”(C ++ 03和int(*)()这样的C99函数指针是自解引用的,调用int(*)()或int(&amp;)()是相同的,因此需要统一消息)

这是return1实际上是(函数指针或引用)。由于int不是“复合类型”,编译器会抱怨.和以下成员