एक दिलचस्प अनुवर्ती (हालांकि बड़े व्यावहारिक महत्व का नहीं) के रूप में मेरे पिछले प्रश्न के लिए: C ++ हमें एक चर घोषित करते समय कोष्ठक में चर नाम को घेरने की अनुमति क्यों देता है?
मुझे पता चला कि इंजेक्टेड क्लास नेम फ़ीचर के साथ कोष्ठक में घोषणा के संयोजन से कंपाइलर व्यवहार के बारे में आश्चर्यजनक परिणाम सामने आ सकते हैं।
निम्नलिखित कार्यक्रम पर एक नज़र डालें:
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
जी ++ 4.9.2 के साथ संकलन मुझे निम्नलिखित संकलन त्रुटि देता है:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
यह MSVC2013 / 2015 और प्रिंट के साथ सफलतापूर्वक संकलित करता है
C (B *)
यह क्लैंग 3.5 और प्रिंट के साथ सफलतापूर्वक संकलित है
C
इतना अनिवार्य प्रश्न कि कौन सा सही है? :)
(मैं दृढ़ता से क्लैंग संस्करण की ओर अग्रसर हुआ, हालांकि और msvc तरीका केवल तकनीकी रूप से इसके टाइप किए गए अजीब के साथ बदलते प्रकार के बाद परिवर्तनीय घोषित करने से रोकने के लिए)
C::C
एक प्रकार का नाम नहीं है यह एक फ़ंक्शन का नाम देता है, इसलिए GCC सही imo है।
C::C y;
समझ में नहीं आता है, है ना? न तो करता हैC::C (y);
पहले मैं पर सोचा इसमें से अधिकांश-अप्रिय-पार्स एक उदाहरण था stackoverflow.com/questions/tagged/most-vexing-parse , लेकिन अब मुझे लगता है कि अर्थ तीनों compilers सिर्फ अपरिभाषित व्यवहार है "ठीक है।"