+
अभिव्यक्ति में +[](){}
एकल है +
ऑपरेटर। इसे इस प्रकार परिभाषित किया गया है: [expr.unary.op] / 7:
यूनिरी +
ऑपरेटर के संचालकों में अंकगणित, असंगत संलयन या सूचक प्रकार होंगे और परिणाम तर्क का मूल्य होगा।
मेमना अंकगणित प्रकार आदि का नहीं है, लेकिन इसे परिवर्तित किया जा सकता है:
[Expr.prim.lambda] / 3
लंबोदर-अभिव्यक्ति का प्रकार [...] एक अद्वितीय, अनाम गैर-संघी वर्ग प्रकार है - जिसे क्लोजर प्रकार कहा जाता है - जिसके गुणों का वर्णन नीचे किया गया है।
[Expr.prim.lambda] / 6
लैम्ब्डा-एक्सप्रेशन के लिए लैम्बडा-कैप्चर के साथ क्लोजर टाइप में पॉइंटर के फंक्शन कॉल ऑपरेटर के रूप में एक ही पैरामीटर और रिटर्न टाइप करने के लिए पॉइंटर के लिए एक public
नॉन virtual
- नॉन - explicit
const
कन्वर्सेशन फंक्शन है । इस रूपांतरण फ़ंक्शन द्वारा लौटाया गया मान किसी फ़ंक्शन का पता होगा, जिसे लागू करते समय, क्लोजर प्रकार के फ़ंक्शन कॉल ऑपरेटर को लागू करने के समान प्रभाव पड़ता है।
इसलिए, unary +
फ़ंक्शन पॉइंटर प्रकार में रूपांतरण को बाध्य करता है, जो इस लंबोदर के लिए है void (*)()
। इसलिए, अभिव्यक्ति +[](){}
का प्रकार यह फ़ंक्शन पॉइंटर प्रकार है void (*)()
।
void foo(void (*f)())
ओवरलोड रिज़ॉल्यूशन के लिए रैंकिंग में दूसरा अधिभार एक सटीक मैच बन जाता है और इसलिए इसे असंदिग्ध रूप से चुना जाता है (क्योंकि पहला अधिभार एक सटीक मिलान नहीं है)।
लैम्ब्डा [](){}
में बदला जा सकता std::function<void()>
की गैर स्पष्ट टेम्पलेट ctor के माध्यम से std::function
है, जो किसी भी प्रकार कि पूरा करता है लेता है Callable
और CopyConstructible
आवश्यकताओं।
लैम्ब्डा void (*)()
को क्लोजर प्रकार (ऊपर देखें) के रूपांतरण फ़ंक्शन के माध्यम से भी परिवर्तित किया जा सकता है ।
दोनों उपयोगकर्ता-परिभाषित रूपांतरण अनुक्रम और एक ही रैंक के हैं। इसीलिए अस्पष्टता के कारण पहले उदाहरण में ओवरलोड रिज़ॉल्यूशन विफल हो जाता है।
डैनियल क्रुगलर के एक तर्क द्वारा समर्थित कैसियो नेरी के अनुसार, इस एकरी +
चाल को निर्दिष्ट व्यवहार होना चाहिए, अर्थात आप इस पर भरोसा कर सकते हैं (टिप्पणियों में चर्चा देखें)।
फिर भी, यदि आप अस्पष्टता से बचना चाहते हैं, तो मैं फ़ंक्शन पॉइंटर प्रकार के लिए एक स्पष्ट कलाकारों का उपयोग करने की सलाह दूंगा: आपको SO पर यह पूछने की आवश्यकता नहीं है कि क्या होता है और यह क्यों काम करता है;)
std::bind
से बाँधstd::function
सकते हैं जिसे फ़ंक्शन लैवल्यू के समान कहा जा सकता है।