Локальных функций нет, но они не очень полезны без замыкания, то есть доступа к локальным переменным.В любом случае вы можете легко эмулировать локальную функцию с помощью лямбды.
Вместо:
void foo(int x)
{
struct S
{
//...
};
int Twice(int n, S *s) //Not allowed
{
return 2*n;
}
S s;
int x = Twice(3, &s);
//...
}
Do:
void foo()
{
struct S
{
//...
};
auto Twice = [](int x, S *s) -> int //Cool!
{
return 2*x;
}; //Twice is actually a variable, so don't forget the ;
S s;
int x = Twice(3, &s);
//...
}
Если набор захвата пуст, ([]
) он даже может быть преобразован в обычный указатель на функцию, как настоящий!
И AFAIK, лямбды могут без проблем использовать локальные типы.Но, конечно, общедоступные статические функции-члены в этой структуре также должны хорошо работать.
И, как дополнительное замечание, косвенно связанное с вашим вопросом, в C ++ 11 разрешено создавать экземпляры шаблона с использованиемлокальный тип (который был запрещен в C ++ 98):
void foo()
{
struct S {};
std::vector<S> vs; //error in C++98, ok in C++11
}