हालाँकि मुझे इस वर्किंग ड्राफ्ट C ++ स्टैण्डर्ड (2014 से) में कोई स्पष्ट उल्लेख नहीं मिल सकता हैstd::nullptr_t
अभिन्न प्रकार निषिद्ध है, इस बात का भी कोई उल्लेख नहीं है कि इस तरह के रूपांतरण की अनुमति है!
हालांकि, से रूपांतरण के मामले std::nullptr_t
को bool
है स्पष्ट रूप से उल्लेख किया है:
४.१२ बूलियन रूपांतरण
अंकगणित, अनकैप्ड एन्यूमरेशन, पॉइंटर या पॉइंटर टू मेंबर टाइप का एक प्रिव्यू टाइप बूल के प्रिव्यू में बदला जा सकता है। शून्य मान, अशक्त सूचक मान या अशक्त सदस्य सूचक मान मिथ्या में परिवर्तित हो जाता है; किसी भी अन्य मान को सत्य में परिवर्तित किया जाता है। प्रत्यक्ष-आरंभीकरण (8.5) के लिए, प्रकार std :: nullptr_t का एक प्रकार टाइप बूल के एक प्रचलन में परिवर्तित किया जा सकता है; परिणामी मूल्य गलत है।
इसके अलावा, इस ड्राफ्ट दस्तावेज में एकमात्र स्थान जहां std::nullptr_t
अभिन्न प्रकार से रूपांतरण का उल्लेख किया गया है, "पुन: व्याख्या_कास्ट" अनुभाग में है:
5.2.10 पुनर्व्याख्या कास्ट
...
(4) एक पॉइंटर को स्पष्ट रूप से किसी भी अभिन्न प्रकार में परिवर्तित किया जा सकता है जो इसे धारण करने के लिए पर्याप्त हो। मैपिंग फ़ंक्शन कार्यान्वयन-परिभाषित है। [नोट: यह उन लोगों के लिए अनिश्चित है, जो अंतर्निहित मशीन की एड्रेसिंग संरचना को जानते हैं। - अंतिम नोट] प्रकार std का मान :: nullptr_t को अभिन्न प्रकार में बदला जा सकता है; रूपांतरण का एक ही अर्थ और वैधता है जो अभिन्न प्रकार के (शून्य *) 0 के रूपांतरण के रूप में है। [नोट: किसी भी प्रकार के मान को std :: nullptr_t में बदलने के लिए एक रीइंटरप्रिट_का उपयोग नहीं किया जा सकता है। - अंतिम नोट]
इसलिए, इन दो अवलोकनों से, कोई (IMHO) उचित रूप से यह अनुमान लगा सकता है कि MSVC
संकलक सही है।
संपादित करें : हालांकि, "कार्यात्मक संकेतन कास्ट" का आपका उपयोग वास्तव में विपरीत सुझाव दे सकता है! MSVC
संकलक, में एक सी शैली डाली का उपयोग कर उदाहरण के लिए कोई समस्या नहीं है:
uintptr_t answer = (uintptr_t)(nullptr);
लेकिन (आपके कोड में), यह इस बारे में शिकायत करता है:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
फिर भी, एक ही ड्राफ्ट मानक से:
5.2.3 स्पष्ट प्रकार रूपांतरण (कार्यात्मक संकेतन)
(1) एक साधारण-प्रकार-विनिर्देशक (7.1.6.2) या टाइप-नेम-स्पेसिफायर (14.6) के बाद एक कोष्ठक अभिव्यक्ति-सूची द्वारा निर्दिष्ट प्रकार के मूल्य का निर्माण होता है जिसे अभिव्यक्ति सूची दी गई है। यदि अभिव्यक्ति सूची एक एकल अभिव्यक्ति है, तो टाइप रूपांतरण अभिव्यक्ति समतुल्य कास्ट एक्सप्रेशन (5.4) में समतुल्य (परिभाषितता में, और यदि अर्थ में परिभाषित किया गया है) है। ...
"संबंधित कास्ट एक्सप्रेशन (5.4)" सी-स्टाइल कास्ट को संदर्भित कर सकता है।