2011-01-09 15 views
5

में पूर्णांक प्रकारों और पूर्णांक रूपांतरणों के बीच अंतर क्या है सी ++ मानक (पूर्णांक पदोन्नति) की धारा 4.5 उच्च रैंक वाले अभिन्न प्रकारों को परिवर्तित करने के विशिष्ट मामलों के बारे में वार्ता करता है।सी ++

एक पूर्णांक प्रकार का एक rvalue एक अन्य पूर्णांक प्रकार का एक rvalue में बदला जा सकता:

धारा सी ++ मानक (अभिन्न रूपांतरण) के 4.7 (बुलेट 4.7.1) के साथ शुरू होता है। एक गणना प्रकार का एक रैल्यू एक पूर्णांक प्रकार के एक रैल्यू में परिवर्तित किया जा सकता है।

जहां तक ​​मैं 4.5 में वर्णित रूपांतरणों को समझता हूं (शायद बुलेट 4.5.3 (enums) को छोड़कर) अकेले 4.7 सेक्शन की तकनीकों का उपयोग करके किया जा सकता है: 4.5.1 और 4.5.2 पूरी तरह से कवर किए गए हैं 4.7.1 द्वारा; 4.5.4 4.7.4 द्वारा कवर किया गया है। तो पूरे 4.5 खंड का उद्देश्य क्या है? यह कौन से अतिरिक्त रूपांतरण सक्षम करता है? शायद मुझे कुछ प्रतिबंध याद आ रहे हैं?

पीएस मैं मानक के सी ++ 03 संस्करण पढ़ रहा हूँ।

उत्तर

8

मुझे लगता है कि कि गौरव क्योंकि दोनों एक ही रूपांतरण श्रेणी में गिर नहीं है और अलग अलग रैंक (देखें 13.3.3.1.1, स्टैंडर्ड रूपांतरण दृश्यों) है महत्वपूर्ण है।

स्टैंडर्ड रूपांतरण दृश्यों रैंक के द्वारा आदेश दिया जाता है:: रैंक एक फर्क जब यह संकल्प ओवरलोड की बात आती है बनाता है एक सटीक मिलान एक संवर्धन, जो एक रूपांतरण की तुलना में एक बेहतर रूपांतरण है तुलना में एक बेहतर रूपांतरण है।

अंत में, मेरा मानना ​​है कि यह है कि निम्नलिखित कोड स्पष्ट करता है 4.5 और 4.7 के बीच अंतर है:

#include <iostream> 

void foo(int i)   { std::cout << "foo(int)" << std::endl; } 
void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; } 

int main() 
{ 
    foo(static_cast<short>(1)); 
} 
  • int को short तरक्की है (पदोन्नति पद इस प्रकार वाले)
  • short से unsigned short एक रूपांतरण है (इस प्रकार रूपांतरण रैंक है)

अंत में, यह कोड foo(int) पर कॉल करता है क्योंकि यह एक बेहतर उम्मीदवार है।

4

प्रचार अंकगणितीय और अन्य परिचालनों के दौरान होते हैं। रूपांतरण तब होते हैं जब केवल एक अभिन्न प्रकार को दूसरे के अंदर संग्रहीत किया जाता है।

+0

हम्म। तो अगर मैंने 'हस्ताक्षर किए गए चार को; हस्ताक्षरित चार बी; ... लघु सी = ए + बी', शुरुआत में 'ए' और 'बी' * प्रचारित * से (अन) हस्ताक्षरित इन्स में जोड़ा गया है, और फिर परिणाम * परिवर्तित * से' छोटा 'है? –

+0

@buratinas, हाँ। – AProgrammer

+2

@buratinas: ए को असंगत int में पदोन्नत किया जाता है, बी को हस्ताक्षरित int में पदोन्नत किया जाता है, फिर बी को बढ़ावा देने के परिणाम को बिना हस्ताक्षर किए गए int में परिवर्तित किया जाता है, फिर इन्हें जोड़ा जाता है और परिणाम हस्ताक्षरित लघु में परिवर्तित हो जाते हैं। –