मैं केवल अनुमान लगा सकता हूं, लेकिन मुझे लगता है कि ऐसा इसलिए है क्योंकि इसे सी ++ में जोड़ा गया था जबकि भाषा में जोड़े जाने वाले रेवल्यू संदर्भ और अग्रेषण संदर्भों को जोड़ा गया था।
तो इसके एपीआई के कुछ हिस्सों में अग्रेषण संदर्भ मिले, और कुछ नहीं।
एक नाबालिग लाभ नहीं है: यदि F
की प्रतिलिपि निर्माता फेंक सकता है, जबकि इस कदम, std::function(F)
गारंटी नहीं कर सकते किया जा सकता है फेंक नहीं है, जबकि std::function(F const&)
नहीं हो सकता। अंतर यह है कि प्रतिलिपि template<class F> function(F)
मामले में कन्स्ट्रक्टर के बाहर की जाएगी, लेकिन गैर-रावल्यू पारित होने पर template<class F> function(F&&)
मामले में कन्स्ट्रक्टर के अंदर।
यह एक अनिवार्य कारण नहीं है।
यह function(F)
के SFINAE व्यवहार को निर्दिष्ट करना भी मामूली रूप से आसान बना देगा, लेकिन इसे C++ 11 के बाद तक औपचारिक रूप से लागू नहीं किया गया था, इसलिए यह कारण नहीं हो सकता है।
template<class F>function(F)
की लागत F
की एक अगली अग्रेषण संस्करण पर कम है - इसलिए शायद यह बदलने के लिए किसी की प्राथमिकता सूची पर अधिक नहीं है (विशेष रूप से क्योंकि यह "सूक्ष्म परिवर्तन का कारण बन सकता है" "function(F)
के परीक्षण, और इसलिए वास्तव में सिद्धांत में कुछ अजीब कोड तोड़ने का कारण बन सकता है)।
लेकिन 'std :: function' में कई कन्स्ट्रक्टर और एकाधिक ऑपरेटर = हैं। एक चालक कन्स्ट्रक्टर सहित जो चालक ऑपरेटर = के अनुरूप है। – michalsrb
@michalsrb उनके उदाहरण में 'एफ एंड' 'आर-वैल्यू-रेफरेंस नहीं है –
वही सवाल यहां पूछा गया है: https://groups.google.com/a/isocpp.org/forum/#!topic/ std-चर्चा/ozZQh6dEsiA –