क्या कोई मुझे यह समझने में सहायता कर सकता है कि निम्न कोड त्रुटि क्यों उत्पन्न करता है?फ़ंक्शन ऑब्जेक्ट को लपेटने के लिए std :: फ़ंक्शन का उपयोग करना
class A
{
public:
float& operator()()
{
return _f;
}
private:
float _f = 1;
} a;
auto& foo()
{
std::function<float()> func = a;
return func();
}
int main()
{
std::cout << foo() << std::endl;
}
त्रुटि:
error: non-const lvalue reference to type 'float' cannot bind to a temporary of type 'float'
return func();
^~~~~~
1 error generated.
यहाँ, operator()
में, मैं _f
के लिए एक संदर्भ लौट सकते हैं और इसके परिणामस्वरूप, मैंने सोचा था कि func()
एक अस्थायी नहीं है। अगर कोई मुझे समझने में मदद करता है तो यह बहुत अच्छा होगा।
मैंने ऐसा भी सोचा, क्योंकि यह ठीक से संकलित करता है, लेकिन मुझे डर है कि यह यूबी है, क्योंकि यह सही ढंग से चलने वाला प्रतीत नहीं होता है (उदाहरण के लिए यह क्रैश या प्रिंट 0)। –
मुझे यह प्रश्न दिलचस्प पाया गया: यदि आप इसे 'ऑटो' और ' 'बनाते हैं, तो यह काम कर सकता है; यदि आप इसे 'ऑटो' और ' 'बनाते हैं तो यह भी काम करता है। कौनसा सही है? मुझे लगता है कि 'ऑटो' और '' एक सही है क्योंकि आपको संदर्भ द्वारा स्थानीय चर वापस नहीं करना चाहिए, है ना? –
@ मार्सनमाओ हां, हमें स्थानीय संदर्भ में संदर्भ वापस नहीं करना चाहिए, बिंदु 'foo' को प्रतिलिपि द्वारा वापस लौटाया जाना चाहिए। (यह अभी भी अज्ञात है कि क्यों ओपी को संदर्भ द्वारा वापसी की आवश्यकता है।) – songyuanyao