This answer सी ++ 14 में लैम्ब्डा के भीतर एक चर को कैप्चर करने के तरीके को बताता है।लैम्ब्डा को स्थानांतरित करना: एक बार जब आप एक चाल-प्रकार के प्रकार पर कब्जा कर लेते हैं, तो लैम्ब्डा का उपयोग कैसे किया जा सकता है?
लेकिन एक बार जब आप लैम्ब्डा के भीतर एक गैर-प्रतिलिपि योग्य वस्तु (जैसे std::unique_ptr
) को स्थानांतरित कर लेते हैं, तो आप लैम्ब्डा की प्रतिलिपि नहीं बना सकते हैं।
अगर आप चल सकता लैम्ब्डा यह ठीक होगा, लेकिन जब ऐसा करने के लिए कोशिश कर रहा एक संकलन त्रुटि मिलती है:
using namespace std;
class HasCallback
{
public:
void setCallback(std::function<void(void)>&& f)
{
callback = move(f);
}
std::function<void(void)> callback;
};
int main()
{
auto uniq = make_unique<std::string>("Blah blah blah");
HasCallback hc;
hc.setCallback(
[uniq = move(uniq)](void)
{
std::cout << *uniq << std::endl;
});
hc.callback();
}
यह g++
साथ निम्न त्रुटि पैदा करता है (मैं नकल करने का प्रयास किया केवल प्रासंगिक लाइन):
error: use of deleted function ‘main()::<lambda()>::<lambda>(const main()::<lambda()>&’
... जिसका अर्थ है, मुझे लगता है, कि मेरे लैम्ब्डा स्थानांतरित करने के लिए प्रयास विफल हो गया।
clang++
एक समान त्रुटि देता है।
मैंने लैम्ब्डा में स्पष्ट रूप से move
कोशिश की (हालांकि यह एक अस्थायी मूल्य है), लेकिन इससे मदद नहीं मिली।
संपादित करें: नीचे दिए गए उत्तर उपरोक्त कोड द्वारा उत्पादित संकलन त्रुटियों को पर्याप्त रूप से संबोधित करते हैं। वैकल्पिक दृष्टिकोण के लिए, release
अद्वितीय सूचक का लक्ष्य मान std::shared_ptr
में, जो कॉपी किया जा सकता है। (मैं इसे एक उत्तर के रूप में नहीं लिख रहा हूं, क्योंकि यह मान लेगा कि यह एक एक्सवाई समस्या है, लेकिन अंतर्निहित कारण unique_ptr
का उपयोग लैम्ब्डा में नहीं किया जा सकता है जो std::function
में परिवर्तित हो जाता है समझने के लिए महत्वपूर्ण है।)
संपादित 2: हिंसक रूप से पर्याप्त, मुझे अभी एहसास हुआ कि auto_ptr
वास्तव में सही चीज़ (!), जहां तक मैं कह सकता हूं, सही काम करता हूं। यह अनिवार्य रूप से unique_ptr
की तरह कार्य करता है, लेकिन चाल-निर्माण के स्थान पर प्रति-निर्माण की अनुमति देता है।
मुझे लगता है कि setCallback rvalue संदर्भ के बजाय मूल्य द्वारा पैरामीटर मिलना चाहिए, मैं गलत कर रहा हूँ? – Slava
@ स्लावा जो मैंने मूल रूप से किया था, लेकिन यह वही त्रुटि दे दी। मैंने सोचा था कि रावल्यू संदर्भ लेने से लैम्ब्डा को स्थानांतरित करने की अनुमति मिल जाएगी (लेकिन बल), लेकिन ऐसा नहीं लगता है। –