int foo(int x)То есть тело такой функции пишется внутри другой функции, и она может ссылать на ее переменные.
{
int y = 0;
void bar(int z)
{
y += x*z;
}
bar(1);
bar(2);
return y;
}
В C++ такого счастья нет. Может такого не сделали из-за того, что в Сях стек устроен немного по-другому, нежели в Паскале (в любом случае - не оправдание), может Бьярн счел это "не тру". Конечно, можно написать локальный класс, у которого будет нужная функция, но которому придется вручную передавать нужные переменные - но это неудобно, да и выглядит ужасно. Вот как-то так:
int foo(int x)Но с новым стандартом этот способ стал гораздо короче в записи:
{
int y = 0;
class foobar
{
public:
bar(int &y, int x) : y(y), x(x)
{
}
void operator ()(int z)
{
y += x*z;
}
private:
int &y, x;
} bar(y, x);
bar(1);
bar(2);
return y;
}
int foo(int x)Если сравнить с кодом, приведенным в начале - отличия минимальны! А уж если оно выглядит как утка, плавает как утка и крякает как утка - то чем не
{
int y = 0;
auto bar = [&](int z)
{
y += x*z;
};
bar(1);
bar(2);
return y;
}