Краткий ответ: нет.
C ++ 0x лямбды были изобретены, чтобы делать именно то, что вы хотите.На самом деле они не более чем способ сделать Increment
в приведенном ниже примере анонимным / встроенным.Это единственный способ получить анонимную функцию в любом из стандартных C ++.
struct Increment {
int & arg;
Increment (int a) : arg (a) {}
void operator () (int & i)
{arg += i;}
};
void foo (const std :: vector <int> & buffer, int x)
{
std :: for_each (
buffer .begin (), buffer .end (),
Increment (x)); // C++98
std :: for_each (
buffer .begin (), buffer .end (),
[&x] (int & i) {x += i;}); // C++0x
}
Единственная волшебная вещь в лямбдах - это то, что их тип не может быть написан, нокомпилятор может связать внутренний скрытый тип с std::function
(или даже с указателем на функцию C при некоторых обстоятельствах).
Я публикую приведенный выше код, потому что я думаю, что ваш вопрос может не означать, что вы думаете, что он делает. Лямбда определенно является C ++ 0x, но в этом примере Increment
является замыканием .(Некоторые скажут, что оно становится закрытием, только если вы вернете его, и связанная переменная выйдет из контекста, в котором она была связана - это придирчиво, но это то, что, скажем, делает Javascript).или замыкания?