2013-08-02 7 views
5

§ आईएसओ/आईईसी 14882 के 17.6.4.9 से: 2011 (ई) (सी ++ 11):क्या सी ++ कार्यान्वयन किसी भी रावल्यू संदर्भ फ़ंक्शन पैरामीटर को मानने की अनुमति है अद्वितीय है?

निम्न में से प्रत्येक कार्यों डी सी में नेड ++ मानक पुस्तकालय, जब तक स्पष्ट फाई के लिए सभी तर्कों पर लागू होता है अन्यथा कहा।
[स्निप]
- यदि कोई फ़ंक्शन तर्क किसी रावल्यू संदर्भ पैरामीटर से बंधे हैं, तो कार्यान्वयन यह मान सकता है कि यह पैरामीटर इस तर्क का एक अद्वितीय संदर्भ है।

यह विनिर्देश केवल मानक लाइब्रेरी फ़ंक्शंस पर लागू होता है, लेकिन ऐसा लगता है कि इस तरह की धारणा के लिए रावल संदर्भों का पूरा बिंदु संभव है। अगर मेरे पास कोई ऐसा फ़ंक्शन है जो एक रावल्यू संदर्भ लेता है और इसे पास करता है (या तो अस्थायी या std::move के माध्यम से), क्या कार्यान्वयन कानूनी रूप से अनुकूलन निष्पादित कर सकता है जो इसे अद्वितीय मानते हैं? यदि नहीं, तो क्या कोई कार्यान्वयन वैसे भी करता है?

+3

मुझे आपका प्रश्न निश्चित नहीं है। ऐसा लगता है कि आपके पास उद्धरण में जवाब सही है: 'कार्यान्वयन यह मान सकता है कि यह पैरामीटर एक अद्वितीय' –

+1

उद्धरण मानक लाइब्रेरी फ़ंक्शंस के लिए इसका उत्तर देता है। लेकिन कार्यक्रम में परिभाषित कार्यों के बारे में क्या? –

उत्तर

5

भाषा स्वयं ही अनिवार्य नहीं है कि एक रावल्यू संदर्भ किसी अन्य वस्तु को उपनाम नहीं कर सकता है, यह मानक लाइब्रेरी फ़ंक्शंस की एक पूर्व शर्त है। तो यदि "कार्यान्वयन" से आपका मतलब कंपाइलर है, तो नहीं - संकलक इस आवश्यकता के आधार पर कोई अनुकूलन नहीं करेगा, निश्चित रूप से आपके द्वारा लिखे गए कोड में नहीं।

यदि किसी विशेष कंपाइलर में कुछ प्रकार के एक्सटेंशन होते हैं जो कोड को एलियासिंग जानकारी व्यक्त करने की अनुमति देते हैं, तो पूर्व शर्त से मानक पुस्तकालय कार्यों के लिए ऐसे एक्सटेंशन का लाभ उठाना संभव हो जाता है। इस तरह की अलियासिंग जानकारी संकलक के लिए कुछ अनुकूलन करने के लिए संभव हो सकती है।

किसी भी मामले में, कथन का मुख्य परिणाम यह है कि मानक पुस्तकालय कार्यान्वयन को फ़ंक्शन पैरामीटर के अनुचित अलियासिंग के मामले में उचित रूप से व्यवहार करने की आवश्यकता नहीं है। उदाहरण के लिए, आप

std::vector<int> some_vector(100, 42); 
auto p = std::make_pair(std::move(some_vector), some_vector); 

साथ एक जोड़ी का निर्माण करता है, तो यह है कि p.first == p.second कोई गारंटी नहीं है।

इस तरह की आवश्यकता की अनुपस्थिति के लिए इस तरह की अनुपस्थिति का अर्थ है कि मानक लाइब्रेरी को कुछ पागल चीजें करना है ताकि यह सुनिश्चित किया जा सके कि vector.insert(vector.end(), vector[3]) जैसे कोड को वेक्टर को फिर से चालू किया जाए। मुझे लगता है कि समिति ने सोचा था कि यह रावल्यू एलियासिंग का पता लगाने के लिए कार्यान्वयन के लिए अवास्तविक था और कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-कभी-

+1

ओह, मैं देखता हूं। उद्धरण में "कार्यान्वयन" फ़ंक्शन_ के क्रियान्वयन को संदर्भित करता है, न कि भाषा के कार्यान्वयन। –

+0

@DyP मुझे लगता है कि 'std :: make_pair()' मानक पुस्तकालय में गैर-कन्स्ट्रक्टर, गैर-असाइनमेंट ऑपरेटर फ़ंक्शन का एक अच्छा उदाहरण है जिसमें एक से अधिक तर्क हैं जो एक संदर्भ हो सकते हैं, जिनमें से कम से कम एक एक रैल्यू संदर्भ हो। 'std :: make_pair (std :: move (some_container), some_container) 'उदाहरण के लिए अनिर्दिष्ट परिणाम होंगे। – Casey

+1

@DyP असाइनमेंट एक उदाहरण नहीं है, क्योंकि इसमें एकाधिक तर्क नहीं हो सकते हैं - अकेले कई तर्क दें जो उपनाम हैं। मैं एक बेवकूफ हूँ, अनुस्मारक के लिए धन्यवाद। अब बेहतर है? – Casey

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