c ++ 11 — самый неприятный анализ C ++ снова

Взят прямо из http://herbsutter.com/2013/05/09/gotw-1-solution/

В то время как widget w(); для меня понятно, я понятия не имею, как приведенный ниже код может быть объявлением функции?

// same problem (gadget and doodad are types)
//
widget w( gadget(), doodad() );  // pitfall: not a variable declaration

Как это возможно?

39

Решение

В объявлении функции аргументы типа array распадаются на указатели на первый элемент, аргументы типа function распадаются на указатель на функцию, поэтому сигнатура будет:

widget w( gadget(*)(), doodad(*)() );

То есть функция, которая принимает в качестве первого аргумента указатель на функцию, не имеющую аргументов и возвращающую gadget, который принимает в качестве второго аргумента указатель на функцию, не имеющую аргументов и возвращающую doodad и что сама функция возвращает widget

Есть еще более интересные или запутанные случаи, такие как:

// assume 'x' is a variable defined somewhere:
widget w(gadget(x));

Как мог тот интерпретировать как объявление функции? Я имею в виду, x переменная, верно? Ну, при объявлении переменной вы можете добавить дополнительные скобки, так gadget x; а также gadget (x); оба объявляют одну и ту же переменную x, То же самое относится к аргументам функции, поэтому приведенный выше код выглядит как объявление функции, которая принимает первый аргумент с именем x типа gadget и возвращает widget

44

Другие решения

Это функция, которая получает две функции, которая возвращает gadget а также doodad и ни один из них не получает аргументов.

Пример, который хорошо компилируется.

#include <iostream>
class widget{};
class gadget{};
class doodad{};
gadget a(){}
doodad b() {};
widget w( gadget(), doodad() ){
}
int main() {
w(a,b);
return 0;
}

http://ideone.com/YjZK9Y

1

По вопросам рекламы [email protected]