2017-01-18 12 views
46
#include <iostream> 

void IsTrue(const bool value) { 
    if (value) { 
    std::cout << "value is True!\n"; 
    } 
} 

int main() 
{ 
    IsTrue([]() { ; /* some lambda */ }); 

    return 0; 
} 

आउटपुट:लैम्ब्डा एक बूल में क्यों परिवर्तित होता है जिसका मूल्य सत्य है?

value is True! 

क्यों लैम्ब्डा जीसीसी & बजना पर true को मूल्यांकन करता है? एमएसवीसी इसे नहीं बना सकता (लैम्ब्डा को बूल में परिवर्तित नहीं कर सकता)।

क्या यह एक कंपाइलर बग है? या मानक के कौन सा अनुच्छेद यह अनुमति देता है?

+11

यह सुनिश्चित नहीं है कि यह कानूनी है या नहीं, लेकिन ऐसा लगता है कि यह लैम्ब्डा को फ़ंक्शन पॉइंटर में परिवर्तित कर रहा है और उसके बाद उस मान का उपयोग कर रहा है (जो शून्य नहीं है) तो यह संकलित करता है। यदि आप एक कैप्चर जोड़ते हैं [यह संकलन करने में विफल रहता है] (http://coliru.stacked-crooked.com/a/f28beac0173e86e4)। – NathanOliver

+8

एमएसवीसी [एक गैर मानक विस्तार] है (https://adishavit.github.io/2016/magical-captureless-lambdas/), इसलिए आपको गंतव्य फ़ंक्शन पॉइंटर प्रकार को स्पष्ट रूप से वर्तनी करने की आवश्यकता है, अन्यथा रूपांतरण विफल हो जाएगा। – cpplearner

+0

यह भी देखें [फ़ंक्शन पॉइंटर के रूप में लैम्ब्डा पास करना] (http://stackoverflow.com/q/28746744/1708801) –

उत्तर

44

सी ++ 14 मानक (§5.1.2) का कहना है:

कोई लैम्ब्डा पर कब्जा के साथ एक गैर सामान्य लैम्ब्डा अभिव्यक्ति के लिए बंद करने के प्रकार एक सार्वजनिक गैर है आभासी गैर स्पष्ट स्थिरांक रूपांतरण समारोह सी ++ भाषा लिंकेज (7.5) एक ही पैरामीटर होने के साथ काम करते हैं और बंद प्रकार के समारोह कॉल ऑपरेटर के रूप में प्रकार वापसी सूचक है। इस रूपांतरण फ़ंक्शन द्वारा लौटाए गए मान को उस फ़ंक्शन का पता दिया जाएगा, जिसे लागू होने पर, प्रभाव बंद करने के प्रकार के फ़ंक्शन कॉल ऑपरेटर का आह्वान करने के समान होता है।

चूंकि एक फ़ंक्शन पॉइंटर bool पर स्पष्ट रूप से परिवर्तनीय है, तो आपको जो परिणाम दिखाया गया है, आपको मिलती है। यह पूरी तरह से कानूनी है।

एमएसवीसी इसे संकलित नहीं करता है क्योंकि यह रूपांतरण ऑपरेटर विभिन्न कॉलिंग सम्मेलनों (__stdcall, __cdecl, आदि) के साथ अधिभारित है। x64 के लिए संकलन करते समय उन सभी कॉलिंग सम्मेलनों का उपयोग नहीं किया जाता है, इसलिए केवल एक रूपांतरण ऑपरेटर है और यह ठीक से संकलित करता है।

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