स्टैंडर्ड क्या कहते हैं
मानक कहते हैं (18,2)
nullptr_t इस प्रकार परिभाषित किया गया है:
namespace std {
typedef decltype(nullptr) nullptr_t;
}
प्रकार जिसके लिए nullptr_t पर्याय है विशेषताओं में वर्णित है 3.9.1 और 4.10।
कहाँ 3.9.1 मूल रूप से कहना है कि वह void*
और 4.10 के रूप में एक ही आकार का होना चाहिए nullptr
के लिए रूपांतरण नियम निर्दिष्ट करता है।
संपादित करें: 3.9.9 इसके अलावा स्पष्ट रूप से कहा गया है कि nullptr_t
एक अदिश प्रकार है, जो के लिए उम्मीद प्रारंभ नियमों का मतलब है में निर्मित प्रकार 8.5 लागू होते हैं:
- डिफ़ॉल्ट-प्रारंभ (
nullptr_t n;
) है, जो n
के मूल्य को अपरिभाषित करता है। जैसा कि जोहान्स शाएब ने सही तरीके से बताया, यह क्लैंग के नवीनतम संस्करण के साथ ठीक है।
- मूल्य प्रारंभ (
nullptr_t n = nullptr_t();
) है, जो करने के लिए 0.
यह व्यवहार n initializes उदा के समान है int
, इसलिए nullptr_t
निश्चित रूप से डिफ़ॉल्ट-रचनात्मक है। यहां दिलचस्प सवाल यह है कि nullptr_t
के लिए अनिर्धारित मूल्य होने का क्या अर्थ है? दिन के अंत में, nullptr_t
के लिए केवल एक अर्थपूर्ण संभव मूल्य है, जो nullptr
है। इसके अलावा प्रकार केवल nullptr
शाब्दिक के अर्थशास्त्र के माध्यम से परिभाषित किया जाता है। क्या ये अर्थशास्त्र अभी भी एक प्रारंभिक मूल्य के लिए आवेदन करते हैं?
क्यों उस सवाल का अभ्यास
आप प्रकार nullptr_t
का एक नया चर घोषित करने के लिए नहीं करना चाहती में कोई फर्क नहीं पड़ता। उस प्रकार का एकमात्र सार्थक अर्थात् पहले से ही nullptr
शाब्दिक के माध्यम से व्यक्त किया गया है, इसलिए जब भी आप nullptr_t
प्रकार के अपने कस्टम चर का उपयोग करेंगे, तो आप nullptr
का भी उपयोग कर सकते हैं।
क्या अभ्यास
इसका एकमात्र अपवाद तथ्य यह है कि आप प्रकार nullptr_t
के गैर प्रकार टेम्प्लेट पैरामीटर ले जा सकते हैं से आता है में फर्क पड़ता है। इस मामले के लिए, यह जानना उपयोगी है कि कौन से मान nullptr_t
में परिवर्तित हो सकते हैं, जो 4 में वर्णित है।10:
एक नल पॉइंटर लगातार एक अभिन्न निरंतर अभिव्यक्ति (5.19) पूर्णांक प्रकार है कि शून्य या प्रकार std::nullptr_t
के prvalue का मूल्यांकन की prvalue है। [...] अभिन्न प्रकार के एक शून्य सूचक स्थिर को std::nullptr_t
के प्रकार के रूप में परिवर्तित किया जा सकता है।
कौन सा मूल रूप से करता है सिर्फ तुम क्या उम्मीद थी: आप
nullptr_t n = 0; // correct: 0 is special
नहीं बल्कि
nullptr_t n = 42; // WRONG can't convert int to nullptr_t
दोनों जीसीसी 4.6 लिख सकते हैं और बजना SVN यह अधिकार मिलता है।
मैंने सोचा था कि आपको एक सादे सूचक प्रकार के रूप में 'nullptr_t' को संभालना था, यानी एक वर्ग के रूप में नहीं। तो मैं मान रहा हूं कि 'nullptr_t n;' _uninitialised_ चर बनाता है; आपको माना जाता है कि 'nullptr_t n = nullptr;' स्पष्ट रूप से लिखें। लेकिन मेरे पास सी ++ 11 कंपाइलर नहीं है, इसलिए मैं जांच नहीं कर सकता। और मुझे लगता है कि मैं इसे औपचारिक चश्मे में कहाँ पढ़ता हूं ... –
FWIW, क्लैंग "nullptr_t n;" स्वीकार करता है यहाँ। –