2016-06-10 5 views
5

एक वस्तु को जीवित रखने की कोशिश कर रहा है (लेकिन shared_ptr संदर्भित करने के लिए ऐसा करने के लिए की जरूरत नहीं) मुझे लगने इस तरह सामान लेखन: दृश्य स्टूडियो कि कहा कि मैं प्रतिलिपि नहीं कर सके में एक त्रुटिसी ++: क्या आप लैम्ब्डा निहित प्रति कैप्चर प्लस स्पष्ट कॉपी कैप्चर कर सकते हैं?

void ClassDerivedFromSharedFromThis::countdown(ThreadPool &pool, std::string name){ 
    auto self = shared_from_this(); 
    pool.then([=, self]{ 
     for(int i = 0;i < 10;++i){ 
      atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n"; 
     } 
    }); 
} 

लेकिन तब मिला -capture स्पष्ट रूप से, क्योंकि मैं पहले से ही परोक्ष कॉपी-कब्जा करने गया था ... यह मैं लिखने के लिए मजबूर:

void countdown(ThreadPool &pool, std::string name){ 
    auto self = shared_from_this(); 
    pool.then([=]{ 
     self; //Capture self. 
     for(int i = 0;i < 10;++i){ 
      atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n"; 
     } 
    }); 
} 

मैं इस काम करता है, लेकिन यह गलत लगता है। चूंकि मुझे केवल shared_ptr स्वामित्व के दुष्प्रभाव की आवश्यकता है और इसे सीधे संदर्भित करने की आवश्यकता नहीं है, इसलिए मैं इसे लैम्ब्डा बॉडी के बजाय कैप्चर सूची में व्यक्त करना चाहता हूं।

मेरे असली कोड में मेरे पास नेटवर्क कोड में कुछ नेस्टेड लैम्ब्डा में कैप्चर करना चाहता था और लगभग कैप्चर करना आसान था और संपादित करने के लिए आसान तरीका था।

मेरा प्रश्न है: क्या यह मानक व्यवहार या विजुअल स्टूडियो 2015 का लैम्ब्डा कैप्चर सीमाओं पर अपना स्वयं का लेना है? मानक के नए संस्करण इस के लिए अनुमति देते हैं, या किसी ने इसके बारे में बात की है?

+2

'[यह, स्वयं]' के बारे में कैसे? –

+2

या 'स्वयं-> परमाणु काउंटर ++ '। – Jarod42

+1

[यह, स्वयं] ठीक होगा, सिवाय इसके कि मुझे 3 पैरामीटर पसंद हैं जो मैं भी कैप्चर करना चाहता था, इसलिए ऐसा लगता है: [यह, स्वयं, पी 1, पी 2, पी 3] जो मैंने वास्तव में पहले किया था, लेकिन फिर फैसला किया [=] {self; ...} @ kerrekSB – M2tM

उत्तर

7

हाँ यह मानक व्यवहार है। से सी ++ 14 (N4140) [expr.prim.lambda]/8

एक लैम्ब्डा कब्जा एक कब्जा-डिफ़ॉल्ट कि है =, कि से प्रत्येक सरल कब्जा शामिल है लैम्ब्डा-कैप्चर फॉर्म "& पहचानकर्ता" का रूप होगा।

तो अगर आप [=] तो किसी अन्य पर कब्जा तुम क्या तरह

[=, &some_var]{} // copy all implicitly but explicitly capture some_var by reference 

नियम सी ++ 17 में बदल सकता हूँ संदर्भ द्वारा किया जाना चाहिए, लेकिन यह अनुमति है

[=, *this]{}; 

जो ऑब्जेक्ट की प्रतिलिपि लैम्ब्डा में कैप्चर करेगा। बोनस है कि आप अलग से self घोषित करने के लिए की जरूरत नहीं है के साथ

void ClassDerivedFromSharedFromThis::countdown(ThreadPool &pool, std::string name){ 
    pool.then([=, self=shared_from_this()]{ 
     for(int i = 0;i < 10;++i){ 
      atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n"; 
     } 
    }); 
} 

:

+1

मैं जल्द ही आपका जवाब स्वीकार करूंगा, मैं इस प्रश्न को आईएसओसीपी बोर्डों पर एक मिनट के लिए पोस्ट करना चाहता हूं ताकि मैं इससे पहले कुछ और आँखें प्राप्त कर सकूं। धन्यवाद। – M2tM

+2

@ एम 2 टीएम कोई समस्या नहीं। हैप्पी कोडिंग :) – NathanOliver

1

आप क्या आप एक init-capture साथ चाहते हैं कर सकते हैं।

+0

मेरा मानना ​​है कि यह केवल सी ++ 17 में उपलब्ध है, लेकिन निश्चित रूप से! – M2tM

+1

यह [सी ++ 14] (http://en.cppreference.com/w/cpp/language/lambda#Lambda_capture), वास्तव में। –

संबंधित मुद्दे