Почему g ++ сообщает, что функция имеет тип int () ()? - PullRequest
2 голосов
/ 26 февраля 2012
$ 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 ()()'
$

Может быть, это зависит от компилятора, но есть ли какое-то значение / значение дополнительной пары скобок в int ()(), как указано в g ++ выше?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2012

Идея этого синтаксиса заключается в следующем:

  • Внутренняя пара скобок означает Я функция
  • int слеваозначает Мой тип возвращаемого значения int
  • Правая пара скобок означает Я не беру аргументов

Следовательно, если функция имелабыло объявлено как

int return1(int a)

сообщение об ошибке будет говорить о int ()(int).

Но способ представления типа функции действительно зависит как от компилятора, так и от версии.Например, GCC 4.5.1, который я только что попробовал, просто сказал int(), как вы предложили, как более интуитивно понятный.

5 голосов
/ 26 февраля 2012

Указатель функции будет 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 голос
/ 26 февраля 2012

в компиляторе с поддержкой C ++ 11, int()() в сообщениях об ошибках означает «вызываемый элемент (первый ()), не имеющий параметров (второй ()), возвращающий int (указатели на функции C ++ 03 и C99, такие как int(*)() являются саморазыменованными, и вызов int (*) () или int (&) () одинаков, поэтому необходимо объединить сообщение)

Это то, чем на самом деле является return1 (функция указатель или ссылка ). И будучи int не «составным типом», компилятор жалуется на . и следующий член .

...