[=] Có nghĩa là gì trong C ++?


93

Tôi muốn biết những gì [=]không? Đây là một ví dụ ngắn

template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
    return [=] (T input) -> T { return (offset + input) * factor; };
}

auto milesToKm = makeConverter(1.60936, 0.0);

Làm thế nào mã sẽ hoạt động với []thay vì [=]?

Tôi cho rằng

std::function<T (T)>

nghĩa là một nguyên mẫu hàm được (T)làm đối số và kiểu trả về T?


4
Điều này được bình chọn cao một cách kỳ lạ cho một thứ gì đó dường như đặt ra 3 câu hỏi khác nhau chưa được tìm kiếm và là bản sao của Biểu thức lambda trong C ++ 11 là gì?
underscore_d

Tôi đồng ý với @underscore_d - Có vẻ như một số nhấp chuột đang thực hiện tăng xếp hạng, phải không? :)
BitTickler

Câu trả lời:


108

Các [=]bạn đang đề cập đến là một phần của danh sách chụp cho biểu thức lambda. Điều này cho C ++ biết rằng mã bên trong biểu thức lambda được khởi tạo để lambda nhận được bản sao của tất cả các biến cục bộ mà nó sử dụng khi nó được tạo. Điều này là cần thiết để biểu thức lambda có thể tham chiếu đến factoroffsetlà các biến cục bộ bên trong hàm.

Nếu bạn thay thế [=]bằng [], bạn sẽ gặp lỗi trình biên dịch vì mã bên trong biểu thức lambda sẽ không biết các biến offsetfactortham chiếu đến là gì. Nhiều trình biên dịch đưa ra thông báo lỗi chẩn đoán tốt nếu bạn làm điều này, vì vậy hãy thử nó và xem điều gì sẽ xảy ra!


13
"Điều này là cần thiết" - tùy chọn chính xác này không cần thiết; chúng tôi cũng có thể viết [&], [=offset, =input]v.v.
MM

1
@MM - Điều đó không có liên quan đến người dân địa phương sao?
Vô dụng

5
@MM Sử dụng tham chiếu chụp ở đây sẽ là một vấn đề vì vòng đời của các biến cục bộ đó sẽ kết thúc ngay sau khi lambda được trả về. Mặc dù vậy, bạn nói đúng rằng chúng tôi có thể liệt kê các biến riêng lẻ.
templatetypedef

45

Đó là một danh sách chụp lambda . Làm cho các biến có sẵn cho lambda. Bạn có thể sử dụng [=]bản sao theo giá trị hoặc bản sao [&]chuyển qua tham chiếu.


3
Bạn cũng có thể sử dụng []mà không chụp bất cứ thứ gì. :)
Daniel Kamil Kozar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.