Разъясните в С++, пожалуйста
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void foo(string myname)
{
typedef vector<string> names;
int y;
names n;
// ...
names::iterator i =
find_if(n.begin n.end [&](const string& s){return s != myname && s.size > y;});
}
вот такое у меня не компилируется (gcc-4.4.2)
Two proposals to introduce C++ language support for closures (both proposals call them lambda functions) are being considered by the C++ Standards Committee [1], [2].И ссылочки даны.
А на то, что там операторные скобки и код внутри оператора вызова функции ты не обратил внимания, только на [&]
Это предложения для нового мифического стандарта C++, который вдохнет в этот язык второе дыхание, я верю в это
Ололо, поробуй -std=c++0x или -std=gnu++0x передать
не, то, что там внутри функция и её как бы хотят обернуть - это я понял.
я не совсем понял, как прочитать [&]
Тогда [&](int a){ return a * a * a; } можно писать везде, где можно f.
Например передать как параметр функции void g( int (*xint a) );
Типа [&] — «адрес вот такой вот функции».
все равно плюется. Но надо эту тему пробить. Начинать осваивать новые штуки. На самом деле большинство содраны с того, что уже где-то есть (foreach, лямбда-функторы... просто глянуть, как это синтаксически выглядит.
quad ~ $ g++ -std=c++0x -c a.C
a.C: In function ‘void foo(std::string)’:
a.C:14: ошибка: expected primary-expression before ‘[’ token
a.C:14: ошибка: expected primary-expression before ‘]’ token
a.C:14: ошибка: expected primary-expression before ‘const’
quad ~ $ g++ -std=gnu++0x -c a.C
a.C: In function ‘void foo(std::string)’:
a.C:14: ошибка: expected primary-expression before ‘[’ token
a.C:14: ошибка: expected primary-expression before ‘]’ token
a.C:14: ошибка: expected primary-expression before ‘const’
ну раз это proposal, то можно и забить
есесно, стандарт пока еще далек от утверждения
я не совсем понял, как прочитать [&]Читается как "лямбда", ня?
Это будет работать в g++ 4.5.0
я не совсем понял, как прочитать [&]Это значит, что внешние переменные связываются по ссылке по умолчанию. В данной функции у тебя используется myname, она передается по ссылке в лямбда-функцию. Можно написать еще так [=] - тогда она будет копироваться, а можно и [=, &myname] - все внешние переменные по умолчанию связываются по значению, а myname по ссылке.
2010-я студия компилит без проблем
Вот здесь кратенько, но просто и ясно описан синтаксис лямбда-функций http://msdn.microsoft.com/en-us/library/dd293603(VS.100).aspx
Оставить комментарий
yolki
что-то у меня с утра слегка хромает соображение.[&] - это как?
отсюда: http://en.wikipedia.org/wiki/Closure_%28computer_science%29