2013-03-20 7 views
16

का अर्थ निम्न कोड के लिए:घोषणा में परिवर्तन प्रतीक

struct foo {}; 

struct A 
{ 
    typedef foo foo_type; 

    void foo(); 
}; 

जीसीसी एक संकलक त्रुटि देता है:

test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive] 
    void foo(); 
      ^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive] 
struct foo {}; 
     ^

लेकिन बजना संकलक त्रुटियों के बिना यह स्वीकार करता है। कौन सही है?

ध्यान दें कि अगर टाइपिफ़ हटा दिया गया है, या typedef ::foo foo_type में बदल दिया गया है, तो दोनों जीसीसी और क्लैंग कोड स्वीकार करते हैं।

+0

असली सवाल यह है: * क्यों * क्लैंग हमेशा सही है? –

+1

जब कोई टाइपिफ़ नहीं है तो यह अजीब नहीं है – 4pie0

+0

@ cf16: मैंने यह नहीं कहा था कि यह था। मैं बस यह इंगित करना चाहता था कि, टाइप किए गए त्रुटि का उल्लेख नहीं करने के बावजूद, टाइपपीफ में त्रुटि के साथ कुछ करना है। – HighCommander4

उत्तर

17

जीसीसी सही है, लेकिन बजना एक नैदानिक ​​(3.3.7) देने के लिए आवश्यक नहीं है:

A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.

इसका कारण यह है कि कैसे वर्ग गुंजाइश काम करता है की है। void foo(); की fooपूरे वर्ग A के दायरे के भीतर दिखाई दे रहा है, तो void foo(); की घोषणा समारोह foo के नाम के struct foo की चर्चा करते हुए से typedef में foo के अर्थ बदल जाता है।

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