c++ - लैम्ब्डा क्लोजर लैवेल्यूज़ को रेवल्यू रेफरेंस पैरामीटर के रूप में पास किया जा सकता है




lambda closures (2)

केस 1 कैसे और क्यों काम करता है?

foo को शामिल करने के लिए std::function<void()> उदाहरण की आवश्यकता होती है जो कि एक रेवल्यू रेफरेंस से जुड़ता है std::function<void()> का निर्माण किसी भी कॉल करने योग्य ऑब्जेक्ट से किया जा सकता है जो void() हस्ताक्षर के साथ संगत है।

सबसे पहले, एक अस्थायी std::function<void()> ऑब्जेक्ट का निर्माण []{} । उपयोग किया गया कंस्ट्रक्टर here # 5 here , जो std::function में क्लोजर को कॉपी करता है std::function उदाहरण:

template< class F >
function( F f );

std::move(f) साथ लक्ष्य को प्रारंभ करता है। यदि f सदस्य के लिए कार्य करने के लिए अशक्त सूचक या अशक्त सूचक है, तो *this कॉल के बाद खाली हो जाएगा।

उसके बाद, अस्थायी function आवृत्ति rvalue संदर्भ के लिए बाध्य है।

फ़ंक्शन वापस आने के बाद fn1 बंद होने की स्थिति क्या है?

पहले की तरह ही, क्योंकि यह एक std::function उदाहरण में कॉपी किया गया था। मूल बंद अप्रभावित है।

मैंने पाया कि lvalue लैम्ब्डा क्लोजर को हमेशा rvalue फ़ंक्शन पैरामीटर के रूप में पास किया जा सकता है।

निम्नलिखित सरल प्रदर्शन देखें।

#include <iostream>
#include <functional>

using namespace std;

void foo(std::function<void()>&& t)
{
}

int main()
{
    // Case 1: passing a `lvalue` closure
    auto fn1 = []{};
    foo(fn1);                          // works

    // Case 2: passing a `lvalue` function object
    std::function<void()> fn2 = []{};
    foo(fn2);                          // compile error

    return 0;
}

केस 2 मानक व्यवहार है (मैंने प्रदर्शन उद्देश्यों के लिए सिर्फ एक std::function का उपयोग किया है, लेकिन कोई अन्य प्रकार समान व्यवहार करेगा)।

केस 1 कैसे और क्यों काम करता है? फ़ंक्शन वापस आने के बाद fn1 बंद होने की स्थिति क्या है?


फ़ंक्शन वापस आने के बाद fn1 बंद होने की स्थिति क्या है?

fn1 स्टेटलेस है, क्योंकि यह कुछ भी नहीं पकड़ता है।

केस 1 कैसे और क्यों काम करता है?

यह काम करता है क्योंकि तर्क उस प्रकार से भिन्न प्रकार का होता है जिसे संदर्भित किया जाता है। एक अलग प्रकार होने के कारण, अंतर्निहित रूपांतरण पर विचार किया जाता है। चूंकि lambda इस std::function के तर्कों के लिए कॉल करने योग्य है, इसलिए यह std::function के टेम्पलेट कंवर्टर कंस्ट्रक्टिंग के माध्यम से इसके लिए परिवर्तनीय std::function । रूपांतरण का परिणाम एक प्रचलन है, और इस तरह से इसे रेवल्यू संदर्भ के साथ बांधा जा सकता है।







rvalue-reference