2015-03-10 8 views
5

पर विचार करें:एक योग्य आईडी के साथ सबसे अधिक परेशान पार्स - या नहीं?

struct Foo { 
    enum { bar }; 
    explicit Foo(int){} 
}; 

struct Baz { explicit Baz(Foo){} }; 

Baz b(Foo(Foo::bar)); // #1 

# 1 लाइन सबसे अप्रिय पार्स है, भले ही Foo::bar एक योग्य-आईडी है और संभवतः एक वैध पैरामीटर नाम हो सकता है? Clang and GCC disagree; कौन सा कंपाइलर सही है?

उत्तर

7

क्लैंग सही है।

कुछ हद तक आश्चर्यजनक रूप से, पैरामीटर-घोषणा के लिए व्याकरण परमिट दोनों qualified- और अयोग्य-आईडी है, क्योंकि यह स्वीकार करता है सब declarator रों:

parameter-declaration: 
    attribute-specifier-seq_opt decl-specifier-seq declarator 
    attribute-specifier-seq_opt decl-specifier-seq declarator = initializer-clause 
    attribute-specifier-seq_opt decl-specifier-seq abstract-declarator_opt 
    attribute-specifier-seq_opt decl-specifier-seq abstract-declarator_opt = initializer-clause 

और एक के लिए व्याकरण घोषणाकर्तायोग्य- और अयोग्यता आईडी एस दोनों परमिट देता है। शासन, बेहतर या बदतर के लिए "कोई समारोह पैरामीटर नाम के लिए योग्य-आईडी", एक अर्थ नियम, भले ही यह पैरामीटर-घोषणा कि योग्य-आईडी रों सीधे शामिल नहीं है के लिए एक व्याकरण लिखने के लिए आसानी से संभव है ।

बस this question में स्थिति की तरह, बहुविकल्पी शासन विशुद्ध रूप से syntatic है, और के बाद से

Baz b(Foo(Foo::bar)); 

syntatically एक समारोह घोषणा के रूप में पार्स किया जा सकता है, यह बहुत पार्स किया गया है, भले ही इस मामले परिणामों में बहुविकल्पी में कुछ ऐसा जो कभी संकलित नहीं कर सकता है।

clang bug 4594 भी देखें।

+1

मैं यह कहने जा रहा था कि यह बहुत परिचित दिखता है ;-) तो सही 'gcc' या' clang' कौन है, यह स्पष्ट होना चाहिए लेकिन यह अधिक स्पष्ट होना अच्छा होगा। –

+0

@ShafikYaghmour एक ही विषय पर भिन्नता सुनिश्चित करने के लिए :) इस मामले ने मुझे आश्चर्यचकित कर दिया, और मैं आम तौर पर एमवीपी को ढूंढने में काफी अच्छा हूं ... –

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