2013-03-15 4 views
5

मैं वर्तमान में निम्नलिखित कथन से उलझन में हूं - हालांकि हालांकि यह कथन संकलन समय के दौरान एक त्रुटि उत्पन्न करेगा हालांकि यह नहीं करता है।सूचक का प्रारंभ

// statement 1: 
someclass* q(someclass()); 

मैं समझता हूँ कि अगर बयान इस

// statement 2: 
someclass* q(&someclass()); 

की तरह था मुझे पता है क्यों बयान 1 does not एक त्रुटि उत्पन्न या कि भले ही मान्य है चाहते हैं (वहाँ कुछ भी है मैं पर्दे के पीछे याद आ रही है ?)

+0

क्या आपने पहले उदाहरण में "पॉइंटर" का उपयोग करने का प्रयास किया था? – molbdnilo

उत्तर

12

मुझे पता है क्यों बयान 1 does not एक त्रुटि उत्पन्न या कि भले ही मान्य

पहले बयान मान्य है, हालांकि यह शायद नहीं कर रहा है कि आप क्या उम्मीद करना चाहते हैं: इस बयान की घोषणा है फ़ंक्शन नाम q जो someclass के किसी ऑब्जेक्ट पर पॉइंटर देता है और एक फ़ंक्शन इनपुट करता है जो बदले में कोई तर्क स्वीकार नहीं करता है और someclass प्रकार का ऑब्जेक्ट देता है। इसे Most Vexing Parse कहा जाता है।

दूसरा बयान मान्य नहीं है: यह प्रकार someclass का एक उद्देश्य के लिए q नाम के एक सूचक ऐलान करते हैं और वस्तु someclass() अभिव्यक्ति द्वारा निर्मित की पता करने के लिए इस सूचक को प्रारंभ करने की कोशिश कर रहा है। नोटिस, हालांकि, someclass() एक अस्थायी है, और अस्थायी का पता लेना अवैध है।

+2

इस कारण से, मैं '(' '' के बजाय '=' ऑपरेटर का उपयोग शुरू करने की सलाह दूंगा। जैसे 'someclass * q = someclass(); 'जैसा कि आप उम्मीद करते हैं, एक त्रुटि उत्पन्न करेगा। – Lorkenpeist

+2

दूसरा कथन वैध नहीं है। आप * अस्थायी पते नहीं ले सकते हैं। –

+0

@ बेंजामिन लिंडले: अरे, मैं इसे कैसे नजरअंदाज कर सकता हूं। धन्यवाद –

3

स्टेटमेंट 1 वास्तव में एक फ़ंक्शन के लिए एक घोषणा है। इस फ़ंक्शन को q कहा जाता है, और कोई तर्क लेने वाले फ़ंक्शन में कोई पॉइंटर नहीं लेता है और someclass लौटाता है, और someclass पर पॉइंटर देता है।

Most Vexing Parse देखें।

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