2012-06-14 3 views
9

Я пытаюсь использовать Lambda C++ 11 для инициализации переменной-члена const класса.Можете ли вы использовать список «Лямбда в классе»?

Значительно упрощенный пример:

class Foo 
{ 
public: 
    const int n_; 
    Foo(); 
}; 

Foo::Foo() 
: n_([]() -> int { return 42; }) 
{ 
} 

int main() 
{ 
    Foo f; 
} 

В MSVC10 это дает:

error C2440: 'initializing' : cannot convert from '`anonymous-namespace'::<lambda0>' to 'const int' 

В IDEONE это дает:

prog.cpp: In constructor 'Foo::Foo()': 
prog.cpp:9:34: error: invalid conversion from 'int (*)()' to 'int' 

Я начинаю получить идею, что я не может использовать lambdas в списке инициализации класса.

Могу ли я? Если да, то какой правильный синтаксис?

ответ

22

вы пытаетесь конвертировать из лямбда в целое - вы должны назвать лямбда вместо:

Foo::Foo() 
: n_([]() -> int { return 42; }()) //note the() to call the lambda! 
{ 
} 
7

Ваша переменная объявлена ​​как int.

Вы хотите invoke лямбда? Это должно работать:

n_(([]() -> int { return 42; })()) 

Или вы хотите переменную типа std::function<>?

+0

+1: Да, я пытаюсь заполнить 'n_', возвращая значение из лямбда. –

+1

@John См. Обновление. И я действительно вижу, как это может быть полезно с более сложной (многозадачной) лямбдой. –

+0

Точно. В моем фактическом использовании я сохраняю размер файла только для чтения в байтах. –

2

Вы создаете лямбда, так как состояния компилятора, вы пытаетесь сохранить лямбда себя в n_.

Смежные вопросы