2014-06-25 18 views
10

Xem xét một hàm để so sánh các số nguyên dương; bản thân hàm sử dụng lambda để thực hiện công việc ..C++ 11 biểu thức lambda - Capture vs Argument Passing

// Pass n1, n2 by value to the lambda. 
bool Compare(int n1, int n2) { 
    return [](int n1, int n2) { return n1 > n2; }; 
} 

Đoạn mã trên biên dịch tốt; mặc dù Compare() luôn trả về true;

Tuy nhiên, đoạn mã sau thậm chí thất bại trong việc biên dịch -

// capturing values 
bool Compare(int n1, int n2) { 
    return [n1, n2]() -> bool { return n1 > n2; }; 
} 

và trả về lỗi

lambda.cpp:48:46: error: cannot convert 'Compare(int, int)::__lambda2' to 'bool' in return 
    return [n1, n2]() -> bool { return n1 > n2; }; 

Câu hỏi

Có thể đây không phải là mục đích sử dụng giới thiệu lambda của trong C++, vẫn ...

  1. Tại sao người đầu tiên luôn trả lời đúng?
  2. Tại sao thứ hai không biên dịch?

Trả lời

17

Tại sao người đầu tiên luôn luôn trả về true?

Lambdas phân rã thành con trỏ hàm, chuyển đổi hoàn toàn thành boolean (luôn là true cho lambdas vì con trỏ không bao giờ rỗng).

Tại sao thứ hai không biên dịch?

Lambdas rằng chụp bất cứ điều gì không phải chuyển đổi này vào một con trỏ hàm

Nếu bạn phải sử dụng một lambda (làm thế nào sẽ trạng thái đó được thông qua?):

Gọi đó là:

return [](int n1, int n2) { return n1 > n2; }(n1, n2); //notice the() to call it 

Hoặc, cách thứ hai của bạn, có ý nghĩa hơn, nhưng không nhiều như chỉ return n1 > n2:

return [=] { return n1 > n2; }(); //= captures everything used by value 
            //-> bool and parameter list are redundant 

Cuối cùng, nó có giá trị lưu ý rằng std::greater, trong <functional>, đã thực hiện điều này:

std::sort(…, std::greater<int>()); //std::greater<> in C++14 
+1

Để hoàn chỉnh, nó có giá trị bổ sung như thế nào để sử dụng đúng một giây. –

+0

@RSahu, Xong, cảm ơn. – chris