मैं एसटीएल द्वारा "Don’t Help the Compiler" बात है, जहां वह स्लाइड 26 पर एक समान उदाहरण है देख रहा हूँ:संगत प्रकार लौटने पर स्पष्ट std :: move की आवश्यकता क्यों है?
struct A
{
A() = default;
A(const A&) { std::cout << "copied" << std::endl; }
A(A&&) { std::cout << "moved" << std::endl; }
};
std::pair<A, A> get_pair()
{
std::pair<A, A> p;
return p;
}
std::tuple<A, A> get_tuple()
{
std::pair<A, A> p;
return p;
}
std::tuple<A, A> get_tuple_moved()
{
std::pair<A, A> p;
return std::move(p);
}
इस के साथ
, निम्नलिखित कॉल:
get_pair();
get_tuple();
get_tuple_moved();
इस उत्पादन का उत्पादन:
moved
moved
copied
copied
moved
moved
get_pair
का परिणाम स्थानांतरित है, जैसा कि अपेक्षित है। एक कदम भी एनआरवीओ द्वारा पूरी तरह से elided किया जा सकता है, लेकिन यह वर्तमान प्रश्न के विषय से बाहर है।
get_tuple_moved
का परिणाम भी स्थानांतरित किया गया है, जिसे स्पष्ट रूप से ऐसा माना जाता है। हालांकि, get_tuple
का परिणाम प्रति-निर्मित है, जो मेरे लिए पूरी तरह से स्पष्ट नहीं है।
मैंने सोचा कि return
कथन को पारित किसी भी अभिव्यक्ति को move
पर अंतर्निहित माना जा सकता है, क्योंकि संकलक जानता है कि यह किसी भी तरह से गुंजाइश से बाहर निकलने वाला है। ऐसा लगता है कि मैं गलत हूं। क्या कोई स्पष्टीकरण दे सकता है, यहां क्या चल रहा है?
भी देखें संबंधित है, लेकिन विभिन्न प्रश्न: When should std::move be used on a function return value?
क्या आपने कॉपी एलिशन को अक्षम किया था? इसके अलावा, एक असली एमसीवीई बेहतर पोस्ट करें। – juanchopanza
@juanchopanza यह वास्तव में एक असली एमसीवीई है, बस 'मुख्य() 'में कॉलिंग विधियों को डालें। 'Get_tuple' और' get_tuple_moved' के लिए व्यवहार आरवीओ के बावजूद समान है, जबकि 'get_pair' प्रभावित होता है। – Mikhail
@ मिखाइल: तो यह वास्तव में एक असली एमसीवीई नहीं है (क्योंकि इसे कॉपी और पेस्ट की तुलना में अधिक काम की आवश्यकता है, हालांकि इसमें से केवल एक छोटा सा) :-) –