[=] หมายความว่าอย่างไรใน C ++


95

ฉันอยากรู้ว่าอะไร[=]? นี่คือตัวอย่างสั้น ๆ

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

รหัสจะทำงานร่วมกับ[]แทนที่จะเป็น[=]อย่างไร

ฉันคิดว่า

std::function<T (T)>

หมายถึงต้นแบบฟังก์ชันที่ได้รับ(T)เป็นอาร์กิวเมนต์และประเภทการส่งคืนT?


4
นี่ได้รับการโหวตอย่างแปลกประหลาดสำหรับบางสิ่งที่ดูเหมือนจะถามคำถามที่ยังไม่ได้ศึกษาถึง 3 ข้อและซ้ำกันของนิพจน์แลมบ์ดาใน C ++ 11 คืออะไร?
underscore_d

ฉันเห็นด้วยกับ @underscore_d - ดูเหมือนว่าการคลิกบางส่วนกำลังเพิ่มคะแนนใช่ไหม :)
BitTickler

คำตอบ:


108

สิ่งที่[=]คุณอ้างถึงเป็นส่วนหนึ่งของรายการบันทึกสำหรับนิพจน์แลมบ์ดา สิ่งนี้จะบอก C ++ ว่าโค้ดภายในนิพจน์แลมบ์ดาถูกเตรียมใช้งานเพื่อให้แลมบ์ดาได้รับสำเนาของตัวแปรโลคัลทั้งหมดที่ใช้เมื่อสร้างขึ้น นี่เป็นสิ่งจำเป็นเพื่อให้นิพจน์แลมบ์ดาสามารถอ้างถึงfactorและoffsetซึ่งเป็นตัวแปรท้องถิ่นภายในฟังก์ชัน

หากคุณแทนที่[=]ด้วย[]คุณจะได้รับข้อผิดพลาดของคอมไพเลอร์เนื่องจากโค้ดภายในนิพจน์แลมบ์ดาจะไม่ทราบว่าตัวแปรoffsetและfactorอ้างถึงอะไร คอมไพเลอร์จำนวนมากให้ข้อความแสดงข้อผิดพลาดในการวินิจฉัยที่ดีหากคุณทำเช่นนี้ดังนั้นลองดูว่าเกิดอะไรขึ้น!


13
"จำเป็น" - ไม่จำเป็นต้องใช้ตัวเลือกนี้ เรายังสามารถเขียน[&], [=offset, =input]ฯลฯ
MM

1
@MM - ไม่ได้มีการอ้างอิงถึงคนในท้องถิ่นหรือ?
ไร้ประโยชน์

5
@MM การใช้การจับอ้างอิงที่นี่จะเป็นปัญหาเนื่องจากอายุการใช้งานของตัวแปรโลคัลเหล่านั้นจะสิ้นสุดลงทันทีที่แลมบ์ดาถูกส่งกลับ คุณคิดถูกแล้วที่เราสามารถแสดงรายการตัวแปรทีละรายการได้
templatetypedef

47

มันเป็นรายการจับแลมด้า ทำให้ตัวแปรพร้อมใช้งานสำหรับแลมด้า คุณสามารถใช้[=]สำเนาตามค่าหรือ[&]ที่ส่งผ่านโดยการอ้างอิง


3
คุณยังสามารถใช้[]ที่ไม่ได้จับภาพอะไรเลย :)
Daniel Kamil Kozar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.