2016-01-05 5 views
55

मैं चाहेक्या std :: is_unsigned <bool> :: मूल्य अच्छी तरह से परिभाषित किया गया है?

std::is_unsigned<bool>::value 

अच्छी तरह से मानक के लिए है या नहीं के अनुसार परिभाषित किया गया है सोच रहा हूँ?

मैं सवाल पूछता हूं क्योंकि typename std::make_unsigned<bool>::type अच्छी तरह से परिभाषित नहीं है।

उत्तर

62

bool के लिए हस्ताक्षर की कोई अवधारणा नहीं है। [Basic.fundamental] से/6: प्रकार bool की

मान false के दोनों true हैं। [नोट: signed, unsigned, short, या longbool प्रकार या मान हैं। - अंत नोट] प्रकार bool के मान अभिन्न प्रचार (4.5) में भाग लेते हैं।

इसके विपरीत, signedness स्पष्ट पर हस्ताक्षर किए पूर्णांक प्रकार (पैरा 2) और अहस्ताक्षरित पूर्णांक प्रकार (पैरा 3) के लिए बाहर कहा जाता है।

अब is_signed और is_unsigned लक्षणों के लिए। सबसे पहले, लक्षण हमेशा अच्छी तरह से परिभाषित होते हैं, लेकिन अंकगणितीय प्रकारों के लिए केवल दिलचस्प होते हैं। bool एक अंकगणितीय प्रकार है, और is_signed<T>::value परिभाषित किया गया है (तालिका 49 देखें) T(-1) < T(0) के रूप में। बूलियन रूपांतरण और मानक अंकगणितीय रूपांतरणों के नियमों का उपयोग करके, हम देखते हैं कि falseT = bool के लिए है (क्योंकि bool(-1)true है, जो 1 में परिवर्तित हो जाता है)। इसी प्रकार, is_unsigned<T>::value को T(0) < T(-1) के रूप में परिभाषित किया गया है, जो के लिए true है।

22

is_unsigned [meta.unary.comp] में/2 के रूप में

तो is_arithmetic<T>::valuetrue,
bool_constant<T(0) < T(-1)>::value रूप में एक ही परिणाम है परिभाषित किया गया है; अन्यथा, false

bool † स्पष्ट रूप से एक अंकगणितीय प्रकार (अभिन्न जा रहा है) है। अब विचार करना [conv.bool]/1:

एक शून्य मान, नल पॉइंटर मूल्य, या अशक्त सदस्य सूचक मूल्य false में बदल जाती है; कोई अन्य मान true में परिवर्तित कर दिया गया है।

आईई। bool(0) < bool(-1)false < true के समतुल्य है, और बाद में यह मानता है कि मानों को 0 और 1 पर क्रमशः प्रचारित किया जाता है।

इस प्रकार is_unsigned<bool>::valuetrue है (और, इसके विपरीत, is_signedfalse है) तथ्य यह है कि bool EAN मूल्यों अंकगणितीय आपरेशनों के दौरान अहस्ताक्षरित मूल्यों 0 और 1 के अनुरूप होने की वजह से। हालांकि, यह वास्तव में bool की हस्ताक्षर का आकलन करने के लिए समझ में नहीं आता है, इस पर make_unsigned बहुत कम प्रदर्शन करता है, क्योंकि यह पूर्णांक का प्रतिनिधित्व नहीं करता है, बल्कि राज्यों का प्रतिनिधित्व करता है।


: तथ्य यह है कि इस टेम्पलेट पहली जगह में bool के लिए लागू है इसकी आवश्यकता खंड जा रहा है न के बराबर, bool नहीं किया जा रहा से निर्धारित होता है एक अधूरी प्रकार ([res.on.functions]/(2.5)) और यूनरी टाइप टाइप के लिए [meta.rqmts] में कोई अन्य आवश्यकताएं नहीं दी जा रही हैं।

+0

थोड़ा नाइटपिक: "मान क्रमशः 0 और 1 तक प्रचारित होते हैं" 100% सही नहीं है। रूपांतरण नियम (4.12) कहते हैं कि एक शून्य पूर्णांक मान 'झूठा' में बदल जाता है और _any अन्य_ मान 'सत्य' में परिवर्तित होता है (कोई भी 1 शामिल नहीं है)। मानक एक रूपांतरण को पूर्णांक में भी परिभाषित करता है जहां 'सत्य' _convert_ से 1 होगा, और 'false' _convert_ से 0 होगा, हालांकि यह वास्तव में मूल्यों के बारे में कुछ भी नहीं कहता है। हम सभी जानते हैं, 'सत्य' 67 हो सकता है और 'झूठा' 172 हो सकता है (यह लगभग निश्चित रूप से मामला कभी नहीं है, लेकिन मानक के अनुसार, यह हो सकता है)। अभी भी +1 – Damon

+2

@ डैमन प्रतीक्षा करें, मैं नहीं देखता कि आपकी टिप्पणी मेरी वाक्य पर कैसे लागू होती है। मैंने अभिन्न पदोन्नति के दौरान 0 और 1 को पदोन्नत किए जाने वाले मानों को संदर्भित किया है, जिन्हें 'झूठा <सत्य' का मूल्यांकन करते समय लागू किया जा रहा है। वहां कुछ भी गलत नहीं है। मूल्य प्रतिनिधित्व के बारे में कोई भी बात नहीं कर रहा है (अभी तक)। – Columbo

+0

मेरा मतलब यह है कि 'बूल (-1)' तुरंत 'सत्य' में परिवर्तित हो जाता है, इसमें शामिल 1 को कोई अभिन्न प्रचार नहीं होता है। कोई गैर-शून्य मान तुरंत 'सत्य' में परिवर्तित हो जाता है। इस प्रकार, 'बूल (0) <बूल (-1)' बिल्कुल 'झूठी <सच' के समान है, कोई 1 शामिल नहीं है। मुझे पता है, यह एक नाइटपिक है ... :-) मैंने ज्यादातर उल्लेख किया क्योंकि बहुत से लोग 'true == 1' मानते हैं, और "वहां' 1' में कनवर्ट करें" दिखाई देने वाले अवांछित पाठक को सुझाव दे सकता है कि यह वास्तव में है मामला। – Damon

9

हाँ, यह अच्छी तरह से परिभाषित किया गया है और परिणाम होना चाहिए std::is_unsigned<bool>::value == true

std::is_signed के लिए दस्तावेज़ कहते हैं

तो T एक हस्ताक्षरित अंकगणित प्रकार है, सदस्य निरंतर मूल्य बराबर सच प्रदान करता है। किसी अन्य प्रकार के लिए, मूल्य गलत है।

तो फिर अगर आप std::is_arithmetic

को देखें, तो टी, अंकगणितीय प्रकार (कि, एक अभिन्न प्रकार या फ्लोटिंग प्वाइंट प्रकार है) सदस्य निरंतर बराबर सही मूल्य प्रदान करता है। किसी अन्य प्रकार के लिए, मूल्य गलत है।

कौन सा अंत में std::is_integral

चेकों की ओर जाता है कि क्या टी एक अभिन्न प्रकार है। , सदस्य निरंतर मूल्य जो सच के बराबर है प्रदान करता है, तो टी प्रकार bool, char, char16_t, char32_t, wchar_t, short, int, long, long long, या किसी भी कार्यान्वयन से परिभाषित विस्तारित पूर्णांक प्रकार है, किसी भी हस्ताक्षर किए, अहस्ताक्षरित सहित , और सीवी-योग्य रूपों। अन्यथा, मान गलत के बराबर है।

दिलचस्प है, वहाँ एक और समारोह std::numeric_limits::is_signed जो यह बताता है

std::numeric_limits<T>::is_signed का मूल्य सभी अंकगणित प्रकार T और false अहस्ताक्षरित प्रकार के लिए हस्ताक्षर किए के लिए true है। यह निरंतर सभी विशेषज्ञता के लिए सार्थक है।

कहाँ bool के लिए विशेषज्ञता false है, जो भी पुष्टि की है कि bool अहस्ताक्षरित माना जाता है के रूप में सूचीबद्ध किया गया है।

+0

cppreference एक आधिकारिक स्रोत नहीं है, केवल व्याख्या है। ओपी को एक आधिकारिक जानकारी की आवश्यकता थी - मानक। –

+2

@IlyaPopov ज्यादातर मामलों में cppreference मानक वर्बैटिम उद्धृत करता है और नोट करता है कि कौन सा संस्करण (सी ++ 03/11/14/आदि) यह लागू होता है। – CoryKramer

+0

हाँ, इसे किसी कारण से cpp _reference_ कहा जाता है। Cplusplus.com के विपरीत। – edmz

10

हां, यह अच्छी तरह से परिभाषित है, जैसा कि कोई अन्य यूनरी प्रकार की विशेषता है।

सी ++ 14 (n4140) 20.10.4/2 "एकल प्रकार लक्षण" जनादेश:

इन खाकों में से प्रत्येक एक UnaryTypeTrait (20.10 होगा।1) true_type की आधारभूत विशेषता के साथ यदि संबंधित स्थिति सत्य है, अन्यथा false_type

20.10.1/1:

एक UnaryTypeTrait एक प्रकार की संपत्ति का वर्णन है। यह एक वर्ग टेम्पलेट होगा जो एक टेम्पलेट प्रकार तर्क लेता है और वैकल्पिक रूप से अतिरिक्त तर्क जो वर्णन की जा रही संपत्ति को परिभाषित करने में मदद करता है। यह DefaultConstructible, CopyConstructible होगा, और सार्वजनिक रूप से और स्पष्ट रूप से ली गई, प्रत्यक्ष या परोक्ष रूप अपने BaseCharacteristic, जो टेम्पलेट integral_constant (20.10.3) के एक विशेषज्ञता, टेम्पलेट integral_constant द्वारा निर्धारित करने के लिए तर्क के साथ है से विशेष संपत्ति का वर्णन किया जा रहा है। बेस कैरेक्टरिस्टिक के सदस्य नाम छिपाए नहीं जाएंगे और यूनरी टाइप टाइप में अनजाने में उपलब्ध होंगे।

इस से यह इस प्रकार है कि निर्माण std::is_unsigned<T>::value किसी भी प्रकार T के लिए अच्छी तरह से परिभाषित किया जाना है, चाहे "signedness" की अवधारणा प्रकार या नहीं करने के लिए समझ में आता है है।

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

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