कोड इस प्रकार है

#include <functional>
#include <iostream>

using namespace std;
int foo(int a){
    cout<<a;
    return a;
}

template<typename R, typename ...Args>
function<void()> wrapper( R f, Args&& ... args) {
    function<void()> fun([&] { f(forward<Args...>(args...)); });//crash
    //function<void()> fun=bind(f,forward<Args...>(args...));
    return fun;
}

int main(){
    auto d=wrapper(foo,1);
    d();
    return 0;
}

जब मैं बाइंड का उपयोग करता हूं, तो सब ठीक है। लेकिन जब मैं लैम्ब्डा का उपयोग करता हूं तो प्रोग्राम क्रैश हो जाता है। मुझे आश्चर्य है कि लैम्ब्डा के संदर्भ में चर को पकड़ने का एक तरीका है लेकिन मूल्य (दक्षता के लिए) द्वारा शाब्दिक कब्जा? या मुझे बाँध के साथ रहना चाहिए?

3
Kwan 13 सितंबर 2020, 04:30

1 उत्तर

सबसे बढ़िया उत्तर
function<void()> fun([&] { f(forward<Args...>(args...)); });//crash

इन सभी कैप्चर की गई वस्तुओं, f और सभी args को संदर्भ द्वारा कैप्चर किया जाता है।

ये सभी wrapper के पैरामीटर हैं।

लेकिन जैसे ही wrapper वापस आता है, wrapper के सभी पैरामीटर दायरे से बाहर हो जाते हैं और नष्ट हो जाते हैं। और आपके लैम्ब्डा के कब्जे वाले संदर्भ, वे सभी, लटकते संदर्भ बन जाते हैं।

मुझे यहां कुछ विग्गल रूम दिखाई दे सकता है, संभवत:, जब wrapper के पैरामीटर जो हो सकता है स्वयं संदर्भ हो, लैम्ब्डा के साथ फिर मूल वस्तु के संदर्भ को कैप्चर करना , और स्वयं wrapper पैरामीटर नहीं।

लेकिन यहाँ कुछ भी इसकी गारंटी नहीं देता है।

जैसे, यह सब अपरिभाषित व्यवहार की गारंटी देता है।

यह सच है कि मूल्य के आधार पर f पर कब्जा करने के लिए सिंटैक्स है, और बाकी सब कुछ संदर्भ द्वारा, लेकिन यह आपकी मदद नहीं करेगा।

auto d=wrapper(foo,1);

क्योंकि इस मामले में भी, जिसके साथ आप काम कर रहे हैं, आपका पैरामीटर एक प्रचलन है, जो wrapper के लौटने पर धुएं के गुबार में गायब हो जाएगा, आपके लैम्ब्डा को एक खाली बैग के साथ छोड़कर, एक लटकता हुआ संदर्भ होगा।

मूल्य के आधार पर सब कुछ कैप्चर करने के अलावा आपके पास यहां कोई वास्तविक विकल्प नहीं है।

1
Sam Varshavchik 13 सितंबर 2020, 04:39