C ++ 0x แลมบ์ดาจับตามค่าเสมอ const?


103

มีวิธีใดบ้างในการจับตามมูลค่าและทำให้ค่าที่จับได้ไม่ใช่ const? ฉันมี functor ของไลบรารีที่ฉันต้องการจับภาพและเรียกใช้เมธอดที่ไม่ใช่ const แต่ควรจะเป็น

สิ่งต่อไปนี้ไม่ได้รวบรวม แต่การสร้าง foo :: operator () const จะแก้ไขได้

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}

คำตอบ:


167

ใช้ไม่แน่นอน


auto bar = [=] () mutable -> bool ....

คุณกำลังประกาศตัวดำเนินการ () ของวัตถุแลมบ์ดา const


-5

มีวิธีอื่นในการใช้mutable (โซลูชันที่เสนอโดย Crazy Eddie)

ด้วย[=]บล็อกของคุณจะรวบรวมวัตถุทั้งหมดตามค่า คุณสามารถใช้[&]เพื่อจับภาพวัตถุทั้งหมดโดยอ้างอิง:

auto bar = [&] () -> bool

หรือคุณสามารถจับภาพโดยอ้างอิงเฉพาะวัตถุบางอย่าง[=, & afoo] :

auto bar = [=, &afoo] () -> bool

ดูรายละเอียดล่วงหน้าในหน้านี้ ( ส่วนคำอธิบาย ): http://en.cppreference.com/w/cpp/language/lambda


11
สิ่งนี้แตกต่างไปจากเดิมอย่างสิ้นเชิง ไม่สามารถใช้แทนกันได้ สิ่งนี้ไม่ตอบสนองต่อคำถามของ OP
Edward Strange

1
ปัญหาของวิธีแก้ปัญหานี้คือไม่สามารถใช้ได้กับตัวแปรโลคัลที่ถูกจับที่ถูกทำลายก่อนที่แลมบ์ดาจะถูกเรียกใช้งาน (ตัวอย่างเช่นเมื่อคุณเริ่ม std :: thread ที่แยกออกจากกัน)
Simon Ninon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.