2017-08-24 11 views
6

में कब्जा करने के लिए सदस्य फ़ंक्शन पर संदिग्ध कॉल मुझे कैप्चर this पर एक लैम्ब्डा के अंदर सदस्य फ़ंक्शन को कॉल करने का प्रयास करते समय एक समस्या आई है। फ़ंक्शन का एक कॉन्स और गैर-कॉन्स संस्करण है और यह एक प्रकार पर templated है।लैम्ब्डा

struct TEST 
{ 
    template <typename T> 
    void test() {} 

    template <typename T> 
    void test() const {} 

    TEST() 
    { 
    [this]() 
    { 
     test<void>(); 
    }(); 
    } 
}; 

संदेश::

निम्नलिखित कोड त्रुटि दर्शाता है http://rextester.com/MLU2098

source_file.cpp(13): error C2668: 'TEST::test': ambiguous call to overloaded function 
source_file.cpp(7): note: could be 'void TEST::test<void>(void) const' 
source_file.cpp(4): note: or  'void TEST::test<void>(void)' 
source_file.cpp(13): note: while trying to match the argument list '()' 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64 

मुझे यकीन है कि अगर यह व्यवहार सही और माइक्रोसॉफ्ट संकलक के साथ सिर्फ एक मुद्दा था नहीं था, इसलिए मैं परीक्षण किया कंपाइलर एक्सप्लोरर में जीसीसी और क्लैंग के साथ कोड और दोनों ने त्रुटि के बिना कोड संकलित किया।

कौन सा कंपाइलर सही व्यवहार को प्रदर्शित कर रहा है?

+2

[यहाँ MSVC के साथ एक रेप्रो है] (http://rextester.com/MLU2098) – AndyG

उत्तर

6

यह एमएसवीसी के साथ एक मुद्दा है। निहित this पैरामीटर में सीवी-योग्यता है। यही कारण है कि एक सीवी-क्वालीफायर पर एक सदस्य समारोह अधिभार संभव है। C'tor के शरीर में, this एक गैर-कॉन्स्ट ऑब्जेक्ट को इंगित करता है (प्रारंभिकरण का अर्थ है कि हमें ऑब्जेक्ट को सभी के बाद संशोधित करना होगा)।

यह निर्धारित करने के लिए पर्याप्त है कि कॉल करने के लिए अधिभार क्या है।

किसी भी कारण से, एमएसवीसी उलझन में है। लेकिन अगर आप स्पष्ट रूप से this सूचक एक्सेस करके सदस्य फ़ंक्शन को कॉल करें, भ्रम गायब हो जाती है:

void bar() 
{ 
    [this]() 
    { 
    this->test<void>(); 
    }(); 
} 

Live MSVC Example

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