2017-05-15 12 views
16

निम्नलिखित कोड cppreference.com पर std::lexicographical_compare के एक कार्यान्वयन उदाहरण से आता है के लिए एक में बयान अलग:क्यों (शून्य) दोनों के बीच अल्पविराम पाश

template<class InputIt1, class InputIt2> 
bool lexicographical_compare(InputIt1 first1, InputIt1 last1, 
          InputIt2 first2, InputIt2 last2) 
{ 
    for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2) { 
     if (*first1 < *first2) return true; 
     if (*first2 < *first1) return false; 
    } 
    return (first1 == last1) && (first2 != last2); 
} 

क्यों है वहाँ पाश में एक (void), और क्या होगा इसे वहां नहीं डालने का नतीजा?

+0

कोई '++ पहले 1' से पहले' (शून्य) 'जोड़ने की योजना बना रहा है क्योंकि '++ first1, (शून्य) ++ first2' अभी भी कुछ' ऑपरेटर 'को तुरंत चालू कर सकता है, जिसे कहीं भी घोषित किया गया है, जो अभी भी परेशानी का कारण बन सकता है। – cpplearner

+0

@cpplearner कोई, हुह? –

उत्तर

25

मूल्य के प्रकार InputIt1 प्रकार का उपसर्ग वेतन वृद्धि ऑपरेटर द्वारा दिया गया है, तो अतिभारित अल्पविराम ऑपरेटर तो अभिव्यक्ति ++first1, ++first2 यह आह्वान सकता है, तो ++first2void करने का परिणाम कास्टिंग सुनिश्चित करता है कि कोई अतिभारित अल्पविराम ऑपरेटर अतिभारित अल्पविराम ऑपरेटर के बाद से शुरू हो जाती है नहीं कर सकते हैं पैरामीटर के रूप में void स्वीकार करें।

+1

पागल भाषा विनिर्देशों की पुष्टि की। क्या किसी ने वास्तव में * वैध * उपयोग को अधिभारित करने के लिए देखा है? –

+2

@Passer द्वारा :: boost :: असाइन – VTT

+0

हू? इसका उपयोग कैसे किया जा सकता है? बस बूस्ट चेक आउट :: –

6

ऐसा लगता है कि वे अपने आधारों को कवर करने वाले एक पागलपन प्रवर्धक हैं क्योंकि वे उन प्रकारों के सटीक विवरण नहीं जानते हैं जिनके साथ वे काम कर रहे हैं।

आप जानते हैं कि operator , प्रकारों के लिए अधिभारित किया जा सकता है। इस वजह से, ++first1, ++first2 या यहां तक ​​कि केवल first1, first2 जैसे किसी कथन का उपयोग करते समय अनजाने परिणाम हो सकते हैं।

(void) कास्ट वहां रखा गया है ताकि कोई ओवरलोडेड operator , प्रभावी न हो, क्योंकि ऑपरेटर अपूर्ण void प्रकार पर काम नहीं कर सकते हैं।

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