2017-06-06 9 views
10

सी ++ मानक के अनुसार (§30.7.5.2.4 सी ++ 17 मसौदा (N4659) का), out << ch एक चौड़ा आपरेशन ch पर प्रदर्शन नहीं करेगा, यदि ch एक char और out एक std::ostream है।सी ++ std :: ctype <char> :: widen() की भूमिका क्या है?

इस मतलब यह है कि std::ctype<char>::widen() (अर्थात, char ->char) मानक द्वारा गारंटीकृत है बुनियादी स्रोत चरित्र में सभी पात्रों के लिए एक पहचान समारोह (widen(ch) == ch) सेट होने के लिए?

यदि हां, तो क्या यह बदले में यह इंगित करता है कि सभी स्थानीय लोगों को मानक स्रोत चरित्र सेट से वर्णों के समान गैर-चौड़े (या बहु-बाइट) एन्कोडिंग का उपयोग करने के लिए मानक द्वारा आवश्यक है?

यदि नहीं, तो यह out << 'x' जैसा लगता है, साहित्यिक के लिए वर्ण एन्कोडिंग की एक विशेष पसंद के साथ, शायद सभी स्थानीय लोगों में काम नहीं कर सकता है, भले ही यह कुछ में काम करता हो। यही है, चरित्र अक्षरक एन्कोडिंग का कोई विकल्प नहीं हो सकता है, जैसे कि out << 'x' एक साथ सभी स्थानों में काम करता है।

उत्तर

1

नहीं, यह बस का कहना है कि

template<class traits> 
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, char c); 

के मामले में जहां दोनों धारा और एक ही char प्रकार में << ऑपरेटर ट्रेडों वहाँ कोई रूपांतरण नहीं है में।

तो c टाइप char है और धारा के चरित्र प्रकार नहीं char है, तो seq out.widen(c) के होते हैं; अन्यथा seq में c शामिल हैं।

अन्य सभी मामलों में लोकेल का उपयोग वैकल्पिक रूप से चरित्र को बदलने के लिए किया जाता है, जिसमें स्थानीय लोग क्या कर सकते हैं, इस पर कोई प्रतिबंध नहीं है।

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