2014-09-25 6 views
8
typedef int (*A)[3]; 

int (**p)[3] = new A;    // OK 
int (**q)[3] = new (int(*)[3]); // OK 
int (**r)[3] = new int (*)[3];  // error 

जीसीसी से त्रुटि error: expected primary-expression before ')' token है। इस अभिव्यक्ति में अतिरिक्त कोष्ठक क्यों आवश्यक हैं?नई int (*) [3] एक त्रुटि क्यों है?

+0

संबंधित (लेकिन नकल नहीं): http://stackoverflow.com/q/16634713/1505939 –

+1

क्योंकि एक * नए प्रकार आईडी * हो सकता है कोष्ठक नहीं है। लेकिन यह निश्चित रूप से एक संतोषजनक उत्तर नहीं है। – dyp

+0

शायद इसे असंबद्धता के साथ करना है; जैसे 'int int()' को 'फ़ंक्शन' int (शून्य) ' – dyp

उत्तर

10

मानक नए declarators की सबसे लंबी अनुक्रम के रूप में परिभाषित करता है नए प्रकार आईडी

5.3.4 नई [expr.new]

....

: वहाँ भी एक नोट है, जो एक ऐसी ही स्थिति को दिखाता है (हालांकि यह कार्यों के लिए संकेत आवंटित करती है) है नई प्रकार-आईडी:
        प्रकार-विनिर्देशक-सेकनए declaratorऑप्ट

नए declarator:
        ptr-ऑपरेटर नए declaratorऑप्ट
        noptr-new-declarator

noptr-new-declarator:
        [  अभिव्यक्ति  ]   विशेषता-विनिर्देशक-सेकऑप्ट
        noptr-new-declarator   [  निरंतर अभिव्यक्ति  ]   विशेषता-विनिर्देशक-सेक ऑप्ट

....

नए प्रकार आईडी एक में new- अभिव्यक्तिनए-घोषणाकर्ता का सबसे लंबा संभव अनुक्रम है। [नोट: इस declarator ऑपरेटरों &, &&, *, और [] और उनकी अभिव्यक्ति समकक्षों के बीच अस्पष्टता से बचाता है।-   अंत टिप्पणी] [उदाहरण:

new int * i; // syntax error: parsed as (new int*) i, not as (new int)*i 

* सूचक declarator और नहीं गुणा ऑपरेटर है। -   अंत उदाहरण]

[नोट: एक नए प्रकार आईडी एक नई अभिव्यक्ति कर सकते हैं आश्चर्य की बात प्रभाव है की में कोष्ठकों। [उदाहरण:

new int(*[10])(); // error 

बीमार का गठन क्योंकि बाध्यकारी

(new int) (*[10])(); // error 

इसके बजाय, new ऑपरेटर की स्पष्ट रूप से parenthesized संस्करण यौगिक प्रकार की वस्तुओं को बनाने के लिए इस्तेमाल किया जा सकता (3.9 है। 2):

new (int (*[10])()); 

कार्यों के लिए 10 पॉइंटर्स की एक सरणी आवंटित करता है (कोई तर्क नहीं लेना और int लौट रहा है। -   अंत उदाहरण] -   अंत टिप्पणी]

+0

@MattMcNabb सामान्य रूप से, मानक के साथ यह थोड़ा मुश्किल है। मैंने कुछ व्याकरण निर्माण जोड़े, लेकिन वे पूर्ण नहीं हैं। जैसे _expression_ या _attribute-specifier-seq_ जैसी चीजें यहां परिभाषित नहीं हैं। – AlexD

+0

@AlexD * अभिव्यक्ति * बहुत जटिल होगा, और * विशेषता-विनिर्देशक-सीईसी * अप्रासंगिक है। आईएमएचओ, दिलचस्प हिस्सा यह है कि * नई अभिव्यक्ति * या तो एक (पूरी तरह से) कोष्ठक * प्रकार-आईडी * या एक (एन अनपेक्षित) * नया-प्रकार-आईडी * हो सकता है, जहां * नया-प्रकार-आईडी * हो सकता है (जहां तक ​​मैं देख सकता हूं) में कोई भी कंटेनर नहीं है। – dyp

+0

@dyp जहां तक ​​मैं समझता हूं, _new_type_id_ में _expression_ हो सकता है, जिसमें ब्रांड्स हो सकते हैं, उदा। 'नया int [(3)]'। बीटीडब्ल्यू, पहली पोस्ट के संपादन के लिए धन्यवाद! – AlexD

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