Это ссылка на функцию или что?

#c

#c

Вопрос:

Что означает следующее объявление?

 typedef int (amp;rifii) (int,int);
  

Это ссылка на функцию? Если да, не следует ли ее инициализировать?

Комментарии:

1. velocityreviews.com/forums/t287939-reference-to-a-function.html

Ответ №1:

Он определяет тип «ссылка на функцию, принимающую два int значения и возвращающую int «. Переменные этого типа должны быть инициализированы, но вы не можете поместить инициализатор в typedef. Это не отличается, например, от int :

 int i;

typedef intamp; intref; // no initializer allowed
intref ri(i); // initializer required

int f(int, int);

typedef int (amp;rifii) (int,int); // no initializer allowed
rifii rf(f); // initializer required
  

Комментарии:

1. Что вы имеете в виду под initializer required ?

2. @Nawaz: Под «Требуется инициализатор» я подразумеваю, что вы должны указать инициализатор, то есть инициализировать его в определении. Например, в int a = 3; части = 3 есть инициализатор. Как и (5) в int b(5); . В приведенном выше случае это означает, что intref ri; была бы ошибка, потому что нет инициализатора, но intref ri(i); это нормально, потому что есть инициализатор (а именно (i) ).

Ответ №2:

Это typedef , поэтому его нельзя «инициализировать», он просто вводит новое имя для типа «ссылка на функцию, возвращающую значение int и принимающую два целых числа в качестве аргументов».

Ответ №3:

Это ссылка на функцию, которая принимает два аргумента и тип возвращаемого значения которой является int

Typedef не инициализирован:

 typedef int (amp;rifii) (int,int);
  

Когда вы объявляете ссылку типа rifii , только тогда она должна быть инициализирована.

 rifii r = foo;
  

Где ‘ foo ‘ — это функция, int foo(int, int);

Ответ №4:

Это typedef ссылка на функцию. И typedef не может быть инициализирован. Подумайте о typedef int rank_t; том, что инициализации тоже нет.

Ответ №5:

typedef это все равно, что прийти на званый ужин и сказать привет, я Эд — на этом блюде нет мяса. Определение придаст плоти этим костям.

Комментарии:

1. Для тех, кто не может понять метафору. Это объявление.

2. Нет, это не так. Объявление будет гласить extern int (amp;rifii) (int,int); . Typedef — это нечто другое. В качестве более подходящей метафоры он говорит: «Привет, я Слартибартфаст. Но вы можете называть меня Slart. »

3. Что ж, поскольку редактирование моего комментария завершилось неудачей, я добавляю к нему (и добавляю здесь атрибуцию at) этот дополнительный комментарий: На самом деле моя лучшая метафора все еще не очень хороша, потому что она по-прежнему предполагает один объект. Еще лучшей метафорой было бы, если бы биолог сказал: «Мы собираемся поговорить о canis lupus familiaris, но давайте просто скажем «собака».

4. Ретроспектива — замечательное блюдо, которое следует подавать холодным!. Сколько клинчей в этом!