2012-06-14 36 views
9

Tôi đang cố gắng sử dụng C++ 11 Lambda để khởi tạo biến thành viên const của một lớp.Bạn có thể sử dụng Lambda trong danh sách khởi tạo của lớp không?

Một ví dụ đơn giản hơn nhiều:

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

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

int main() 
{ 
    Foo f; 
} 

Trong MSVC10 sản lượng này:

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

Trong IDEONE sản lượng này:

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

tôi bắt đầu để có được những ý tưởng mà tôi không thể sử dụng lambdas trong danh sách khởi tạo của lớp.

Tôi có thể? Nếu vậy, cú pháp thích hợp là gì?

Trả lời

22

bạn đang cố gắng để chuyển đổi từ một lambda để int - bạn nên gọi lambda thay vì:

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

Biến của bạn được khai báo là int.

Bạn có muốn gọi lambda? Điều này sẽ hoạt động:

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

Hoặc bạn có muốn biến loại std::function<>?

+0

+1: Có, tôi đang cố gắng điền vào 'n_' bằng cách trả về giá trị từ lambda. –

+1

@John Xem cập nhật. Và tôi thực sự thấy cách đó có thể hữu ích với lambda phức tạp hơn (đa tuyên bố). –

+0

Chính xác. Trong trường hợp sử dụng thực tế của tôi, tôi lưu trữ kích thước của một tệp chỉ đọc bằng byte. –

2

Bạn đang tạo một lambda, cách này như tiểu bang biên dịch, bạn đang cố gắng để lưu trữ các lambda chính nó trong n_.

Các vấn đề liên quan