2010-09-27 6 views
17

Wikipedia कहता है:क्या सी ++ 0x अभी भी वैश्विक ऑपरेटर के साथ स्पष्ट रूप से आवंटित कर सकता है?

एक प्रकार असंभव बनाया जा सकता है नए ऑपरेटर के साथ आवंटित करने के लिए:

struct NonNewable { 
    void *operator new(std::size_t) = delete; 
}; 

इस प्रकार के एक वस्तु ही कभी एक ढेर वस्तु के रूप में या किसी अन्य के एक सदस्य के रूप में आवंटित किया जा सकता है प्रकार। इसे गैर-पोर्टेबल चालबाजी के बिना सीधे ढेर-आवंटित नहीं किया जा सकता है। (के बाद से नियुक्ति नया ही तरीका है उपयोगकर्ता के आबंटित स्मृति पर एक निर्माता कॉल करने के लिए है और इस प्रयोग के ऊपर के रूप में मना कर दिया गया है, वस्तु ठीक से निर्माण नहीं किया जा सकता है।)

हटाया जा रहा है ऑपरेटर नई इसमें निजी बनाने के समान है वर्तमान सी ++, लेकिन स्पष्ट रूप से वैश्विक ऑपरेटर का उपयोग नहीं कर रहा है, जो वर्ग-विशिष्ट लुकअप से बचाता है, फिर भी वैध सी ++ 0x?

NonNewable *p = ::new NonNewable(); 
// neither non-portable nor trickery, though perhaps not widely known 

क्या मुझे मसौदे में कुछ याद आया है?


स्पष्ट है कि, यह वैध सी ++ 03 और works fine है:

struct NonNewable { 
private: 
    void *operator new(std::size_t); // not defined 
}; 

int main() { 
    // ignore the leaks, it's just an example 

    void *mem = operator new(sizeof(NonNewable)); 
    NonNewable *p = ::new(mem) NonNewable(); 

    p = ::new NonNewable(); 

    return 0; 
} 
+1

FYI यदि आप जांच रहे हैं: उद्धृत टेक्स्ट विकिपीडिया आलेख से हटा दिया गया है। –

उत्तर

6

मेरा मानना ​​है कि आप सही हैं और विकिपीडिया गलत है। सी ++ 0 एक्स ड्राफ्ट मानक "हटाए गए कार्यों" (8.4p10) का वर्णन उन कार्यों के रूप में करता है जिनका उपयोग किसी भी रूप में नहीं किया जा सकता है (या अन्यथा प्रोग्राम खराब है)। वे सामान्य कार्यों से अलग गुंजाइश या नाम लुकअप में कोई हिस्सा नहीं खेलते हैं। और नए अभिव्यक्तियों से संबंधित प्रासंगिक पैराग्राफ एक ही बने रहे हैं:

[5.3.4p8] एक नई अभिव्यक्ति ऑब्जेक्ट के लिए आवंटन फ़ंक्शन (3.7.4.1) कॉल करके संग्रहण प्राप्त करती है। ...

[5.3.4p9] यदि नई अभिव्यक्ति एक यूनरी :: ऑपरेटर के साथ शुरू होती है, तो आवंटन फ़ंक्शन का नाम वैश्विक दायरे में देखा जाता है। अन्यथा, यदि आवंटित प्रकार एक वर्ग प्रकार टी या सरणी है, तो आवंटन फ़ंक्शन का नाम टी के दायरे में देखा जाता है। यदि यह लुकअप नाम ढूंढने में विफल रहता है, या यदि आवंटित प्रकार कक्षा प्रकार नहीं है, तो आवंटन कार्यक्षेत्र का नाम वैश्विक दायरे में देखा जाता है।

तो हाँ, अभिव्यक्ति ::new NonNewable [या ::new(mem) NonNewable] ::operator new की एक अधिभार का चयन करेंगे, समारोह NonNewable::operator new अनदेखी, और कार्यक्रम के बीमार का गठन नहीं होगा।

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