Разъясните в С++, пожалуйста

yolki

что-то у меня с утра слегка хромает соображение.

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;});
}

[&] - это как?
отсюда: http://en.wikipedia.org/wiki/Closure_%28computer_science%29

yolki


#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)

Serab

Почитай что ли там текст на той страничке на вики, там написано
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].
И ссылочки даны.
А на то, что там операторные скобки и код внутри оператора вызова функции ты не обратил внимания, только на [&] :grin:
Это предложения для нового мифического стандарта C++, который вдохнет в этот язык второе дыхание, я верю в это :D

Serab

Ололо, поробуй -std=c++0x или -std=gnu++0x передать :D

yolki

фух, я слово proposal пропустил.
не, то, что там внутри функция и её как бы хотят обернуть - это я понял.
я не совсем понял, как прочитать [&]

Serab

Ну пусть есть функция int f( int a ) { return a * a; }
Тогда [&](int a){ return a * a * a; } можно писать везде, где можно f.
Например передать как параметр функции void g( int (*xint a) );
Типа [&] — «адрес вот такой вот функции».

Serab

не-а :(
все равно плюется. Но надо эту тему пробить. Начинать осваивать новые штуки. На самом деле большинство содраны с того, что уже где-то есть (foreach, лямбда-функторы... просто глянуть, как это синтаксически выглядит.

yolki

не, всё тоже.

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, то можно и забить

Serab

есесно, стандарт пока еще далек от утверждения :grin:

apl13

я не совсем понял, как прочитать [&]
Читается как "лямбда", ня?

procenkotanya

Это будет работать в g++ 4.5.0

agent007new

я не совсем понял, как прочитать [&]
Это значит, что внешние переменные связываются по ссылке по умолчанию. В данной функции у тебя используется myname, она передается по ссылке в лямбда-функцию. Можно написать еще так [=] - тогда она будет копироваться, а можно и [=, &myname] - все внешние переменные по умолчанию связываются по значению, а myname по ссылке.
2010-я студия компилит без проблем
Вот здесь кратенько, но просто и ясно описан синтаксис лямбда-функций http://msdn.microsoft.com/en-us/library/dd293603(VS.100).aspx
Оставить комментарий
Имя или ник:
Комментарий: