2011-09-07 23 views
8

C++ 0x -n3290 ड्राफ्ट में: वे खंड में कहा: Destructors: 12.4/2 बिंदु अंतिम पंक्तिएक विनाशक को एक सूचक के साथ घोषित किया जाएगा या नहीं घोषित किया जाएगा? सी ++

  **A destructor shall not be declared with a ref-qualifier.** 

C++ 03 ड्राफ्ट में .... वे इस बात का उल्लेख नहीं था विनाशकों में?

मेरे सवाल घोषणा के इस प्रकार की अनुमति है या

*~S() ; //this declaration is allowed or not according to the Standard's 
    //**~S(); ***~S() ; etc........... 

है? जहां ड्राफ्ट में उन्होंने इस बारे में वर्णन नहीं किया ... घोषणा?

जीसीसी 4.6.0 में, सन/Oracle सी ++ 12.0, ---> इस घोषणा की अनुमति दी है पूर्णांक Comeau C/C++ ->

उत्तर

7

आपने गलत समझा है कि रेफ-क्वालीफायर का अर्थ नए मानक में है। उसी तरह से आप C++ 03 में किसी भी सदस्य फ़ंक्शन के लिए const क्वालीफायर प्रदान कर सकते हैं, आप C++ 0x में किसी सदस्य फ़ंक्शन में रेफ-क्वालीफायर भी जोड़ सकते हैं। यही कारण है कि संशोधक कार्य करने के लिए अंतर्निहित this तर्क के प्रकार को प्रभावित करेगा:

struct test { 
    void f() const &&; // implicit "this" in "f" is of type "test const &&" 
}; 

वैसे ही जैसे किसी नाशक static, या const, या const volatile सी ++ 03 में नहीं हो सकता, यह एक रेफरी नहीं ले सकते -क्लिफायर (& या &&) सी ++ 0x में। बेशक यह बिट पूर्व मानक में मौजूद नहीं था।

+0

@ डीएविड: ओह ... लेकिन एक विनाशक की घोषणा के संदर्भ में .. उन्होंने केवल अबाउट ~ ऑपरेटर कहा .. लेकिन जहां उन्होंने कहा नहीं ... ऐसी घोषणा की अनुमति है , इत्यादि की अनुमति नहीं है ... जैसे * ~ ए(), और ~ ए(), आदि – user751747

+2

@ user751747: व्याकरण कहता है कि * रेफ-क्वालीफायर * को दूर दाईं ओर फ़ंक्शंस में जोड़ा गया है (* सीवी-क्वालीफायर के बाद *), और इसका मतलब है कि वाक्य का अर्थ है: '~ ए() &;' या '~ ए() &&;', और दोनों को अमान्य के रूप में परिभाषित करता है। '&~A();' और '* ~ ए(); 'अमान्य हैं क्योंकि वे * व्याकरण * से मेल नहीं खाते हैं, संकलन नहीं करने वाले सभी चीज़ों पर अतिरिक्त विवरण प्रदान करने की आवश्यकता नहीं है। उदाहरण के लिए, मानक में कहीं भी यह कहता है कि 'ए] [+ =/a' गलत है, यह केवल यह बताता है कि कौन सी संरचनाएं सही हैं और कोई भी उनमें से किसी से मेल नहीं खाता है। –

+0

@ डेविड: धन्यवाद – user751747

10

कि जैसे यह कभी होगा नहीं लगता है की अनुमति नहीं एक विनाशक के लिए बहुत कम, किसी भी तरह का एक कानूनी समारोह घोषणा हो। मैं सकारात्मक नहीं हूं कि मानक का वह हिस्सा किस बारे में बात कर रहा है, लेकिन मुझे लगता है।

मुझे संदेह है कि एक क्वालीफायर कह रहा है कि आपका कार्य एक रावल्यू संदर्भ पर बुलाया जा रहा है। कुछ इस तरह:

class A { 
public: 
    void IAmAnRValue() &&; 
}; 

मुझे लगता है कि मानक में भाषा कह रहा है कि इस क्वालीफायर एक नाशक पर अनुमति नहीं है, ज्यादा एक अनुगामी const भी अवैध होगा होने की तरह।

और, आगे की जांच पर, मेरे अनुमान की शुद्धता की मेरी निश्चितता काफी बढ़ जाती है। यहां औचित्य है:

वहां यह स्पष्ट रूप से बताता है कि 'सीवी-क्वालिफ़र' के बाद कार्यों में अब 'रेफ-क्वालीफायर' हो सकता है। इसका मतलब है कि एक समारोह घोषणा अब const & या const volatile && के बजाय const के बाद हो सकती है। और इस्तेमाल किया जाने वाला शब्द (रेफ-क्वालीफायर) उस शब्द के समान होता है जिसका उपयोग आप उद्धृत करने वाले मानक के थोड़ा सा में करते हैं। और यह समझ में आता है कि विनाशकों को एक प्राप्त करने में सक्षम नहीं है।

+0

@ ओमनी: आपके उत्तर के लिए धन्यवाद – user751747

1

नियम आपके लिए एक ही पैरा में कहा गया है देख रहे हैं, 12.4p2

एक नाशक कोई पैरामीटर लेता है, और कोई वापसी प्रकार इसके लिए निर्दिष्ट किया जा सकता है (यहां तक ​​शून्य नहीं)।

वाक्यांश "कोई वापसी प्रकार इसके लिए निर्दिष्ट किया जा सकता" भी मनाही "*" है, जो तुरंत स्पष्ट नहीं है, लेकिन 12.3.2p1 के साथ तुलना करके देखा जा सकता (this issue report की तुलना में):

... इस तरह के कार्यों को रूपांतरण कार्यों कहा जाता है। कोई रिटर्न प्रकार निर्दिष्ट नहीं किया जा सकता है।

वह नियम है जो कार्यान्वयन को * operator int() { } को रोकता है। आप यह भी है, हालांकि के रूप में है जो बहुत साधारण phrased और विनाशकर्ता खंड में पहले बयान है है 12.4p1 बहस कर सकते हैं, मुझे लगता है कि अन्य बयान ऊपर प्राथमिक तर्क

एक विशेष declarator वाक्य रचना एक वैकल्पिक समारोह का उपयोग कर किया जाना चाहिए विनिर्देशक (7.1.2) के बाद ~ विध्वंसक वर्ग के नाम के बाद एक खाली पैरामीटर सूची के बाद कक्षा परिभाषा में विनाशक घोषित करने के लिए उपयोग किया जाता है।

के रूप में देखा जा सकता है/पढ़ ऐसी है कि वर्णन है, जो लेखकों के इरादे से पता चलता में * रूप declarators का कोई उल्लेख नहीं है।

+0

आपके उत्तर के लिए धन्यवाद – user751747

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