Большинство программистов на С++, подобных мне, в какой-то момент допустили следующую ошибку:
class C { /*...*/ };
int main() {
C c(); // declares a function c taking no arguments returning a C,
// not, as intended by most, an object c of type C initialized
// using the default constructor.
c.foo(); // compiler complains here.
//...
}
Теперь, когда ошибка довольно очевидна, как только вы это знаете, мне было интересно, есть ли разумное использование для такого объявления локальной функции, за исключением того, что вы можете это сделать, тем более, что нет возможности определить такую локальную функцию в том же блоке; вы должны определить его в другом месте.
Я думаю, что локальные классы в стиле Java - довольно приятная функция, которую я часто использую, особенно анонимный. Некоторые локальные классы С++ (которые могут иметь встроенные функции-члены) могут быть использованы. Но это выражение локальной функции без определения вещи кажется мне очень неудобным. Это просто C-наследство или есть какой-то более глубокий случай использования, о котором я не знаю?
Изменить для неверующих: C c()
не является объявлением указателя функции.
Эта программа
int main()
{
void g();
cout << "Hello ";
g();
return 0;
}
void g()
{
cout << "world." << endl;
}
выходы Hello world.
Эта программа
void fun()
{
cout << "world." << endl;
}
int main()
{
void g();
g = fun;
cout << "Hello ";
g();
return 0;
}
не компилируется. gcc жалуется:
error: cannot convert 'void ()()' to 'void ()()' in assignment
Комео:
error: expression must be a modifiable lvalue