मैंने पाया कि 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
फ़ंक्शन वापस आने के बाद बंद होने की स्थिति क्या है ?
std::function
मेमने से कटौती किए जाने के तर्क क्यों नहीं दिए जा सकते "। आपका प्रोग्राम टेम्पलेट के तर्कों को कम करने का प्रयास नहीं करता है std::function
, इसलिए निहित रूपांतरण के साथ कोई समस्या नहीं है।
std::function
एक गैर-स्पष्ट रचनाकार है जो लंबोदर क्लोजर को स्वीकार करता है, इसलिए इसमें निहित रूपांतरण है। लेकिन जुड़े हुए प्रश्न की परिस्थितियों में, std::function
लैम्बडा प्रकार से टेम्पलेट तात्कालिकता का अनुमान नहीं लगाया जा सकता है। (उदाहरण के लिए std::function<void()>
से निर्माण किया जा सकता [](){return 5;}
है, भले ही यह एक गैर शून्य वापसी प्रकार है।
fn1
अंतर्निहित रूप से एकstd::function
में रूपांतरित हैfoo(fn1)
। यह अस्थायी कार्य तब एक प्रतिद्वंद्विता है।