2016-09-13 5 views
8

std::function प्रकार विलोपन निर्माता के रूप में परिभाषित किया गया हैstd :: फ़ंक्शन कन्स्ट्रक्टर या असाइनमेंट के बीच कोई अंतर क्यों है?</p> <pre><code>template< class F > function(F f); </code></pre> <p>असाइनमेंट ऑपरेटर के रूप में परिभाषित किया गया है:

template< class F > 
function& operator=(F&& f); 

(स्रोत cppreference)

क्यों निर्माता मूल्य द्वारा f हो जाता है, जबकि operator= संदर्भ अग्रेषित करके f प्राप्त करता है?

+2

लेकिन 'std :: function' में कई कन्स्ट्रक्टर और एकाधिक ऑपरेटर = हैं। एक चालक कन्स्ट्रक्टर सहित जो चालक ऑपरेटर = के अनुरूप है। – michalsrb

+2

@michalsrb उनके उदाहरण में 'एफ एंड' 'आर-वैल्यू-रेफरेंस नहीं है –

+1

वही सवाल यहां पूछा गया है: https://groups.google.com/a/isocpp.org/forum/#!topic/ std-चर्चा/ozZQh6dEsiA –

उत्तर

3

मैं केवल अनुमान लगा सकता हूं, लेकिन मुझे लगता है कि ऐसा इसलिए है क्योंकि इसे सी ++ में जोड़ा गया था जबकि भाषा में जोड़े जाने वाले रेवल्यू संदर्भ और अग्रेषण संदर्भों को जोड़ा गया था।

तो इसके एपीआई के कुछ हिस्सों में अग्रेषण संदर्भ मिले, और कुछ नहीं।

एक नाबालिग लाभ नहीं है: यदि 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) के परीक्षण, और इसलिए वास्तव में सिद्धांत में कुछ अजीब कोड तोड़ने का कारण बन सकता है)।

+0

लेकिन यदि ऐसा है, तो C++ 17 में 'std :: function :: असाइन' को बहिष्कृत क्यों किया जाता है लेकिन कन्स्ट्रक्टर का हस्ताक्षर नहीं बदला जाता है? इसका मतलब है कि किसी ने 'std :: function' API में सुधार करने के बारे में कुछ विचार किया है, फिर भी, उन्होंने कॉपी-द-कॉल करने योग्य-कन्स्ट्रक्टर अपरिवर्तित छोड़ा –

संबंधित मुद्दे

 संबंधित मुद्दे