अंक बनाम: (एक टेम्पलेट कार्य करने के लिए) एक सामान्य लैम्ब्डा गुजर कि this
कब्जा और एक स्पष्ट this->
बिना this
के एक सदस्य फ़ंक्शन को कॉल करने पर संकलन नहीं है जीसीसी। यदि लैम्ब्डा सामान्य नहीं है, या यदि लैम्ब्डा किसी भी अन्य समारोह में नहीं भेजा जाता है लेकिन जगह में बुलाया जाता है, तो यह एक स्पष्ट this->
के साथ संकलित करता है। Clang सभी परिस्थितियों में कोड के साथ शांत है।कॉलिंग `सामान्य लैम्ब्डा से this` सदस्य समारोह - बजना जीसीसी
क्लैंग बनाम जीसीसी के दूसरे दौर के लिए समय। कौन सही है
template<typename TF>
void call(TF&& f)
{
f(1);
}
struct Example
{
void foo(int){ }
void bar()
{
call([this](auto x){ foo(x); });
}
};
int main()
{
Example{}.bar();
return 0;
}
bar()
=call([this](auto x){ foo(x); });
- बजना ++ 3.6+ साथ संकलित करता है।
- जी ++ 5.2+ संकलित नहीं करता है।
error: cannot call member function 'void Example::foo(int)' without object call([this](auto x){ foo(x); });`
bar()
=call([this](auto x){ this->foo(x); });
- बजना ++ 3.6+ साथ संकलित करता है।
- जी ++ 5.2+ संकलन।
bar()
=call([this](int x){ foo(x); });
- बजना ++ 3.6+ साथ संकलित करता है।
- जी ++ 5.2+ संकलन।
bar()
=[this](auto x){ foo(x); }(1);
- बजना ++ 3.6+ साथ संकलित करता है।
- जी ++ 5.2+ संकलन।
this->
आवश्यक केवल एक सामान्य लैम्ब्डा के मामले में क्यों है?
this->
क्यों आवश्यक नहीं है यदि लैम्ब्डा call
पर पास नहीं किया गया है?
गैर मानक-अनुपालन कौन है?
आपके द्वारा नोट किए गए विसंगतियों से संकेत मिलता है कि क्लैंग यहां सही है। –
मानक को देखे बिना, मैं पूर्ण निश्चितता के साथ कह सकता हूं कि क्लैंग सही है। भले ही यह मानक से असहमत हो, फिर भी यह सही है; उस मामले में मानक गलत है। जीसीसी का व्यवहार पूरी तरह से कोई समझ नहीं आता है। –
[संबंधित लेकिन डुप्ली नहीं?] (Http://stackoverflow.com/q/20312062/819272) – TemplateRex