2012-08-09 11 views
12

मुझे एहसास हुआ कि निम्नलिखित जीसीसी 4.7 में ठीक संकलित:क्या मैं एक shared_ptr को 0 असाइन कर सकता हूं? क्यूं कर?

#include <memory> 

int main() { 
    std::shared_ptr<int> p; 
    p = 0; 
} 

हालांकि, वहाँ int से या int* से कोई असाइनमेंट ऑपरेटर है, और या तो int या int* या तो से कोई अंतर्निहित निर्माता है। int* से एक कन्स्ट्रक्टर है, लेकिन वह स्पष्ट है। मैंने मानक पुस्तकालय कार्यान्वयन की जांच की और निर्माता वास्तव में स्पष्ट है, और कोई फिशी असाइनमेंट ऑपरेटर दृष्टि में नहीं हैं।

क्या कार्यक्रम वास्तव में अच्छी तरह से गठित है या जीसीसी मेरे साथ गड़बड़ कर रहा है?

+4

'0' विशेष शाब्दिक है, यह 'nullptr_t' – Abyx

+2

@LucDanton में परिवर्तित होता है क्योंकि g ++ बहुत स्मार्ट है, और' 42 - 42' से '0' में परिवर्तित होता है। क्लेंग, आईआईआरसी में वही बात होती है (आईईसीसी), जीएन2012 – Abyx

+5

@ एबीएक्स में आपका उल्लेख किया गया था - एबीएक्स आप इस बिंदु को याद करते हैं - '0' में भाषा में शाब्दिक के रूप में कोई विशेष उपचार नहीं है। –

उत्तर

16

कारण यह काम करता है मानक से इस छोटे से उद्धरण है:

§4.10 [conv.ptr] p1

एक नल पॉइंटर स्थिर है एक अभिन्न निरंतर अभिव्यक्ति (5.19) पूर्णांक प्रकार की prvalue कि शून्य करने के लिए मूल्यांकन करता है या std::nullptr_t के प्रकार का प्रसार। [...] अभिन्न प्रकार के एक शून्य सूचक स्थिर को std::nullptr_t के प्रकार के रूप में परिवर्तित किया जा सकता है। [...]

और इस तथ्य है std::shared_ptrstd::nullptr_t से एक अंतर्निहित निर्माता है:

§20.7.2.2 [util.smartptr.shared] p1

constexpr shared_ptr(nullptr_t) : shared_ptr() { }

यह भी इस तरह कुछ विषमताएं के लिए अनुमति देता है:

#include <memory> 

void f(std::shared_ptr<int>){} 

int main(){ 
    f(42 - 42); 
} 

Live example.

+7

42 -42 जैसे नल पॉइंटर स्थिरांक होने की विषमताओं के बारे में, यह संभवतः दूर जा रहा है, और [केवल एक शाब्दिक 0 वैध शून्य सूचक स्थिरांक होगा] (http://www.open-std.org/jtc1/sc22/wg21/ डॉक्स/cwg_active.html # 903), सी ++ के भविष्य के संस्करण में। – hvd

+0

@ एचवीडी: दिलचस्प, इसके लिए धन्यवाद! – Xeo

0

आप केवल एक साझा सूचक का एक और उदाहरण के लिए एक साझा सूचक प्रदान कर सकते हैं। Share_pointer धारण प्रकार को असाइन करना संभव नहीं है।

shared_ptr& operator=(const shared_ptr& r);

तुम क्या कर रहे 0 बताए है (जो इस मामले में बराबर होती है शून्य) सूचक के लिए, नहीं प्रकार के मूल्य: afaik इस ऑपरेटर के लिए केवल अधिभार है। आप कोड में इस बिंदु पर भी प्रारंभ नहीं किया गया है।

+0

यह वास्तव में प्रश्न को संबोधित नहीं करता है: "संकलक बिना शिकायत के इसे क्यों स्वीकार करता है" – Flexo

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

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