Эта строка объявляет функцию? C ++ - PullRequest
4 голосов
/ 21 июня 2009

Я читал вопрос Литба о SFINAE здесь , и мне было интересно, что именно его код декларирует. Более простой (без шаблонов) пример приведен ниже:

int (&a())[2];

Что именно это декларирует? Какова роль &? Чтобы добавить к моей путанице, если я вместо этого заявляю следующее

int b()[2];

Я получаю сообщение об ошибке при объявлении функции, возвращающей массив, в то время как в первой строке такой ошибки нет (поэтому можно подумать, что первое объявление не функция). Однако, если я попытаюсь присвоить

a = a;

Я получаю сообщение об ошибке, в котором говорится, что я пытаюсь назначить функцию a ... теперь она является функцией. Что именно это за вещь?

Ответы [ 3 ]

17 голосов
/ 21 июня 2009

Есть такие классные программы, которые называются 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 - нет.

8 голосов
/ 21 июня 2009

Для дальнейшего использования эта ссылка может оказаться полезной, если у вас есть особенно сложное объявление C / C ++ для расшифровки:

Как читать декларации C

Для полноты я повторю то, что сказали другие, чтобы прямо ответить на ваш вопрос.

int (&a())[2];

... объявляет a функцией с нулевым аргументом, которая возвращает ссылку на целочисленный массив размера 2. (Прочитайте основные правила по ссылке выше, чтобы иметь четкое понимание того, как придумал это.)

int b()[2];

... объявляет b функцией с нулевым аргументом, которая возвращает целочисленный массив размера два.

Надеюсь, это поможет.

2 голосов
/ 21 июня 2009
int (&a())[2];

Он объявляет символ a, который является функцией, которая не принимает аргументов и возвращает ссылку на двухэлементный массив целых чисел.

 int b()[2];

Это объявляет символ b, который является функцией, которая не принимает аргументов и возвращает двухэлементный массив целых чисел ... это невозможно при разработке языка.

Это относительно просто: получить таблицу приоритетов операторов, начать имя символа (a) и начать применять операторы, как вы видите из их приоритета. Запишите после каждой примененной операции.

...