Большинство программистов на C ++, таких как я, в какой-то момент допустили следующую ошибку:
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.
//...
}
Теперь, когда ошибка довольно очевидна, когда вы ее знаете, мне было интересно, есть ли разумное применение для такого рода объявлений локальных функций, кроме того, что вы можете это сделать - тем более что define * не существует 1005 * такая локальная функция в том же блоке; Вы должны определить это в другом месте.
Я думаю, что локальные классы в стиле Java - довольно приятная функция, которую я часто использую, особенно анонимная. Даже локальные классы C ++ (которые могут иметь встроенные функции-члены) имеют некоторое применение. Но это объявление локальной функции без определения мне кажется очень неловким. Это просто C-legacy или есть какой-то более глубокий вариант использования, о котором я не знаю?
Редактировать для неверующих: 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