C ++ 0x लैम्ब्डा कैप्चर वैल्यू ऑलवेज कॉन्स्ट?


102

क्या मूल्य द्वारा कब्जा करने और कैप्चर किए गए मूल्य को गैर-कब्जे बनाने का कोई तरीका है? मेरे पास एक पुस्तकालय फ़नकार है जिसे मैं एक विधि पर कब्जा करना और कॉल करना चाहूंगा जो गैर-कास्ट है लेकिन होना चाहिए।

निम्नलिखित संकलन नहीं करता है, लेकिन फू :: ऑपरेटर () कांस्ट इसे ठीक करता है।

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


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

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

  return 0;
}

जवाबों:


165

परस्पर उपयोग करें।


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

आपस में बगैर आप लैम्ब्डा ऑब्जेक्ट का ऑपरेटर () घोषित कर रहे हैं।


-5

परस्पर उपयोग करने का वैकल्पिक तरीका है (क्रेज़ी एडी द्वारा प्रस्तावित समाधान)।

साथ [=] अपने ब्लॉक मूल्यों से सभी वस्तुओं कैप्चर करता है। आप संदर्भ द्वारा सभी वस्तुओं को पकड़ने के लिए [और] का उपयोग कर सकते हैं :

auto bar = [&] () -> bool

या आप केवल कुछ वस्तु के संदर्भ में कब्जा कर सकते हैं [=, & afoo] :

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

सामने के विवरण ( स्पष्टीकरण अनुभाग) के लिए इस पृष्ठ का संदर्भ लें : http://en.cppreference.com/w/cpp/language/bambda


11
यह पूरी तरह से अलग चीजें करता है। वे विनिमेय नहीं हैं। यह ओपी के सवाल का जवाब नहीं देता है।
एडवर्ड स्ट्रेंज

1
इस समाधान की समस्या यह है कि लैम्ब्डा निष्पादित होने से पहले नष्ट किए गए स्थानीय चर पर कब्जा करने के लिए यह काम नहीं करता है (उदाहरण के लिए, जब आप एक अलग एसटीडी :: थ्रेड शुरू करते हैं)।
साइमन निनोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.