2015-11-12 7 views
19

जैसा कि मैं समझता हूं, std::nullptr_tnullptr से शुरू किया जा सकता है साथ ही 0 से भी शुरू किया जा सकता है। लेकिन एक ही समय में तीसरे आरंभीकरण नीचे काम नहीं करता, 5 के बावजूद है 0 रूप में एक ही प्रकार:nullptr_t प्रारंभ करते समय 0 को अन्य पूर्णांक से अलग कैसे किया जाता है?

#include <memory> 

int main() 
{ 
    std::nullptr_t null1=0; 
    std::nullptr_t null2=nullptr; 
    std::nullptr_t null3=5; // error: cannot convert ‘int’ to ‘std::nullptr_t’ in initialization 
} 

कैसे काम करता है? अर्थात। संकलन समय पर मानक पुस्तकालय 05 से अलग करता है, यदि ये अक्षर टेम्पलेट तर्क नहीं हैं?

क्या कोई एक कस्टम क्लास बना सकता है जो संकलन समय पर अपने कन्स्ट्रक्टर के तर्कों को अलग करेगा, इसके लिए std::nullptr_t का उपयोग नहीं कर रहा है?

+1

यह प्रश्न मूल रूप से है: "' -a' और 'b-a' क्यों काम करते हैं, लेकिन'/a' 'b/a' काम नहीं करते हैं?"। क्योंकि टोकन का अर्थ इसके संदर्भ पर निर्भर करता है। – Sumurai8

उत्तर

21

nullptr_t केवल मूल्य nullptr या 0 निर्दिष्ट किया जा सकता है जो कि पूरी तरह से परिवर्तित हो गया है।

N4296 (page.86) के अनुसार:

4,10 सूचक रूपांतरण

एक नल पॉइंटर निरंतर मूल्य शून्य के साथ एक पूर्णांक शाब्दिक या के एक prvalue है टाइप करें std::nullptr_t। एक शून्य सूचक स्थिर एक सूचक प्रकार में परिवर्तित किया जा सकता है; नतीजा शून्य सूचक मूल्य है जो ऑब्जेक्ट पॉइंटर या फ़ंक्शन पॉइंटर प्रकार के अन्य सभी मानों से अलग है और अलग है। [...] अभिन्न प्रकार का एक शून्य सूचक स्थिर को std::nullptr_t के प्रसार के रूप में परिवर्तित किया जा सकता है।

आप स्वयं + C++ के भीतर एक समान प्रकार का निर्माण कर सकते हैं।

std::nullptr_tके रूप में कार्यान्वित किया गया है प्रकार और इसके विशिष्ट गुण संकलक द्वारा लागू किए जाते हैं।


संपादित करें: निर्मित प्रकार पर फिक्स्ड पैरा। धन्यवाद याक!

+0

वह उद्धरण उल्लिखित रूपांतरण की अनुमति नहीं देता है क्योंकि 'std :: nullptr_t' एक सूचक प्रकार नहीं है। – TartanLlama

+0

@ टार्टनलामा ने उद्धृत अनुच्छेद से एक अतिरिक्त वाक्य जोड़ा। उम्मीद है कि यह स्पष्ट करता है। –

11

N3337 [conv.ptr]/1:एक नल पॉइंटर लगातार कि शून्य का मूल्यांकन पूर्णांक प्रकार का एक अभिन्न निरंतर अभिव्यक्ति prvalue या प्रकार std::nullptr_t के prvalue है। एक शून्य सूचक स्थिर को एक सूचक प्रकार में परिवर्तित किया जा सकता है; परिणाम उस प्रकार का शून्य सूचक मान है और ऑब्जेक्ट पॉइंटर या फ़ंक्शन पॉइंटर प्रकार के हर दूसरे मूल्य से अलग है। इस तरह के एक रूपांतरण को शून्य सूचक रूपांतरण कहा जाता है। के दो शून्य सूचक मान समान प्रकार की तुलना करेंगे। सीवी-क्वालिफाइड प्रकार के पॉइंटर को निरंतर एक शून्य सूचक का रूपांतरण एक रूपांतरण है, और एक क्वालीफिकेशन रूपांतरण के बाद पॉइंटर रूपांतरण का अनुक्रम नहीं है।अभिन्न प्रकार के एक शून्य सूचक स्थिर को std::nullptr_t के प्रकार के रूप में परिवर्तित किया जा सकता है।

0 अभिन्न प्रकार का एक नल पॉइंटर स्थिर है, तो यह प्रकार std::nullptr_t के prvalue में बदला जा सकता। 5 एक शून्य सूचक स्थिर नहीं है, इसलिए यह नहीं हो सकता है।

11

मानक पुस्तकालय संकलन समय पर 5 से 0 को अलग करता है, यदि ये अक्षर टेम्पलेट तर्क नहीं हैं?

यह सब पर मानक पुस्तकालय के साथ कोई संबंध नहीं है, nullptr_t निर्मित संकलक के लिए जाना जाता प्रकार, और स्पष्ट रूप से संकलक 5 और 0

के बीच का अंतर जानता है एक एक बना सकता है एक कस्टम क्लास जो संकलन समय पर अपने कन्स्ट्रक्टर के तर्कों को समान रूप से अलग करेगा, इसके लिए std::nullptr_t का उपयोग नहीं कर रहा है?

सामान्य संख्या में।

आप एक प्रकार है कि यह एक सूचक प्रकार का एक तर्क ले बनाकर 5 से 0 और नहीं से प्रारंभ किया जा सकता है लिख सकते हैं क्योंकि 0 एक वैध नल पॉइंटर स्थिर है लेकिन 5 नहीं है। लेकिन आप एक प्रकार लिख नहीं सकते जिसे से बनाया जा सकता है और 5 से नहीं, या ऐसा कुछ भी नहीं।

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

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