2017-03-01 4 views
6

सी में पर विभिन्न परिणामों पर ले जाया जाता कोष्ठकों ++ यह int (x) = 0; तरह कोष्ठकों के अंदर चर घोषित करने के लिए संभव है। लेकिन ऐसा लगता है कि अगर आप चर नाम के बजाय this उपयोग करते हैं, तो निर्माता के बजाय प्रयोग किया जाता है: A (this); कॉल A::A(B*)। तो पहला सवाल क्यों यह this के लिए अलग है, ऐसा इसलिए है क्योंकि चर this नामित नहीं किया जा सकता है? और मामलों थोड़ा की सुविधा देता है एक लैम्ब्डा के अंदर this डाल जटिल -नाम के साथ `this` अंदर लैम्ब्डा घोषणा वेरिएबल के अंदर 3 अलग compilers

struct B; 
struct A 
{ 
    A (B *) {} 
}; 

struct B 
{ 
    B() 
    { 
    [this] { A (this); }(); 
    } 
}; 

अब जीसीसी कॉल A::A(B*), डिफ़ॉल्ट निर्माता और बजना प्रिंट लापता के बारे में MSVC प्रिंट त्रुटि expected expression (https://godbolt.org/g/Vxe0fF)। यह MSVC में भी मजेदार है - यह वास्तव में नाम this साथ वैरिएबल का उपयोग कर सकते हैं बनाता है, इसलिए यह निश्चित रूप से एक बग (https://godbolt.org/g/iQaaPH) है। कौन सा कंपाइलर सही है और इस तरह के व्यवहार के कारण क्या हैं?

+5

'this' एक आरक्षित पहचानकर्ता है, आप इसे की घोषणा नहीं कर सकते हैं। –

+0

@ एनएम। हां, प्रश्न यह है कि क्या होने वाला है - 'यह' आरक्षित –

+1

के कारण कन्स्ट्रक्टर या कंपाइलर त्रुटि को कॉल करना मुझे नहीं लगता कि ए (यह) ए (5) से अलग कैसे है। –

उत्तर

1

सी मानक §5.1.5 ++ में (के लिए सी ++ 11 लेख 7, लेख 8 बाद में मानक) [expr.prim.lambda]:

लैम्ब्डा अभिव्यक्ति के परिसर बयान समारोह पैदावार समारोह कॉल ऑपरेटर के -body (8.4), लेकिन नाम देखने के प्रयोजनों (3.4), प्रकार और मूल्य इस बात का (9.2.2.1) का निर्धारण करने और भाव वर्ग के सदस्य में गैर स्थिर वर्ग के सदस्यों की चर्चा करते हुए ID- बदलने के लिए (* यह) (9.2.2), का उपयोग करके अभिव्यक्तियों का उपयोग लैम्ब्डा-अभिव्यक्ति के संदर्भ में यौगिक-कथन माना जाता है। [उदाहरण:

struct S1 { 
    int x, y; 
    int operator()(int); 
    void f() { 
    [=]()->int { 
     return operator()(this->x + y); // equivalent to S1::operator()(this->x + (*this).y) 
             // this has type S1* 
       }; 
    } 
}; 

- अंत उदाहरण]

इस प्रकार, जीसीसी सही है। आप देखेंगे कि उनके इस तथ्य के बारे में कोई अपवाद नहीं है कि आप this पर कब्जा कर रहे हैं। उनके तथापि सी ++ 14 मामले में के बाद से एक सटीक जहां §5.1.5 में *this पर कब्जा, अभी भी (लेख 17) है,:

हैं * इस प्रति के द्वारा कब्जा कर लिया है, इस में से प्रत्येक ओडीआर उपयोग एक सूचक में बंद करने के प्रकार के नामित डेटा सदस्य, कास्ट (5.4) के रूप में परिवर्तित किया गया है।

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