2012-10-11 14 views
9

संभव डुप्लिकेट:
Why are redundant scope qualifications supported by the compiler, and is it legal?क्या डुप्लिकेट सी ++ वर्ग स्कोप निर्दिष्ट करना ठीक है?

मैं इस संकलन की उम्मीद नहीं होगा, लेकिन यह करता है। क्या यह एक कंपाइलर बग हो सकता है, या क्या इसका कोई सही अर्थ है?

$ g++ -c scopes.cpp 
$ cat scopes.cpp 
class Log { 
public: 
    Log() { } 
    static void fn() { } 
}; 

void test() { 
    Log::Log::Log::Log::Log::Log::fn(); 
} 

$ g++ --version 
g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 
+0

साइड नोट: यह वीसी 10 के तहत संकलित नहीं होगा। हालांकि, एक संकलक स्वीकार करने वाले कोड के रूप में यह साबित नहीं होता है कि यह कानूनी भी है, क्योंकि एक संकलक कोड को अस्वीकार करता है इसका मतलब यह नहीं है कि यह अवैध है। –

उत्तर

9

हाँ, यह कानूनी है। एक वर्ग का नाम अपने नामस्थान में डाला जाता है, जिसे इंजेक्शन-क्लास-नाम कहा जाता है। सी ++ 03 §9/2 से:

[...] वर्ग नाम भी वर्ग खुद के दायरे में डाला जाता है; इसे इंजेक्शन-क्लास-नाम के रूप में जाना जाता है। एक्सेस चेकिंग के प्रयोजनों के लिए, इंजेक्शन-क्लास-नाम माना जाता है कि यह एक सार्वजनिक सदस्य नाम था।

ध्यान दें कि Log::Log नाम वर्ग निर्माता है, जो केवल कुछ संदर्भों में अनुमति दी है, लेकिन जब तक आप Log (जैसे fn के रूप में) के अलावा कुछ के साथ Log::Log::... की श्रृंखला खत्म के रूप में, तो यह नाम नहीं बताती निर्माता। विशेष रूप से, §3.4.3.1/1 ए का कहना है:

नेस्टेड-नाम-विनिर्देशक एक वर्ग C, और नाम नेस्टेड-नाम-विनिर्देशक, जब C में देखा के बाद निर्दिष्ट नामांकित करता है तो , C (खंड 9) का इंजेक्शन-क्लास-नाम है, नाम को वर्ग C के निर्माता का नाम माना जाता है। इस तरह के एक कन्स्ट्रक्टर का नाम केवल घोषणाकर्ता-आईडी में एक कन्स्ट्रक्टर परिभाषा का उपयोग किया जाएगा जो क्लास परिभाषा के बाहर दिखाई देता है।

+2

यह बिल्कुल कानूनी है। इसे संकलित करने का प्रयास करें। – meagar

+2

@ जॉन: आप अभी भी क्यों संदेह करते हैं कि सी ++ भाषा मानक से उद्धरण देखने के बाद यह कानूनी है और कई कंपाइलर चेतावनी/त्रुटियों के बिना इसे स्वीकार करते हैं? –

+0

यह कानूनी है क्योंकि यह परिभाषित व्यवहार है, जिसे spec में दस्तावेज किया गया है। – meagar

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