2016-10-09 22 views
23

मैं यहाँ पर another question की वजह से लैम्बडास और कंपाइलर्स के साथ प्रयोग कर रहा था।
मैं सिर्फ महसूस किया है (और यह वास्तव में पूरी तरह से सामान्य है) कि निम्नलिखित कोड मान्य है:[] <typename>() {} एक वैध लैम्ब्डा परिभाषा है?

int main() { 
    auto l = [](){}; 
    l.operator()(); 
} 

वास्तव में मानक का कहना है कि बंद प्रकार एक सार्वजनिक इनलाइन समारोह कॉल ऑपरेटर है और इतने पर, इस प्रकार यह समझने में सक्षम होने के लिए समझ में आता है।

क्या मैं मानक को देखकर व्याख्या नहीं कर सकते (अच्छी तरह से, काम मसौदा) तथ्य यह है कि जीसीसी (6.1) को संकलित निम्नलिखित स्निपेट है (बजना 3.9 नहीं करता है):

int main() { 
    auto l = []<typename>(){}; 
    l.operator()<void>(); 
} 

कोई चेतावनी नहीं , त्रुटियाँ नहीं। क्या यह वैध कोड है या इसे संकलक द्वारा खारिज कर दिया जाना चाहिए?

+0

[सफलतापूर्वक संकलित] (http://cpp.sh/4asuj) – amanuel2

+1

@ amanuel2 मुझे पता है कि यह संकलित (जीसीसी कम से कम) के साथ है, लेकिन सवाल है, तो है यह मान्य है या नहीं। – skypjack

+1

सी ++ 14 "टेम्पलेटेड" लैम्बडास को अनुमति देगा, लेकिन यह '<>' टेम्पलेट सिंटैक्स के बजाय 'ऑटो' कीवर्ड के साथ है (https://stackoverflow.com/questions/3575901/can-lambda-functions-be देखें -templated)।शायद जीसीसी डेवलपर्स इस तरह की कार्यक्षमता को जोड़ने के विभिन्न तरीकों से प्रयोग करना चाहते थे? –

उत्तर

21

N4140 5.1.2 [expr.prim.lambda] में, एक लैम्ब्डा अभिव्यक्ति के रूप में परिभाषित किया गया है

लैम्ब्डा-परिचयकर्ता लैम्ब्डा-declarator ऑप्ट यौगिक बयान

जहां एक "लैम्ब्डा-परिचयकर्ता"[] है, एक वैकल्पिक "लैम्ब्डा-कैप्चर" और "लैम्ब्डा-घोषणाकर्ता ऑप्ट "" (पैरामीटर-घोषणा-खंड) " से शुरू होने वाली सामग्री है।

[]<typename>(){} 

कि आवश्यकता को पूरा नहीं करता है लैम्ब्डा परिचयकर्ता और लैम्ब्डा declarator के बीच कुछ न होने के कारण, तो यह एक वैध लैम्ब्डा अभिव्यक्ति नहीं है।

इस प्रकार, आपका उदाहरण कोड वैध C++ मान्य नहीं है और इसे संकलक द्वारा अस्वीकार किया जाना चाहिए।


यह भी टैग है के रूप में, मैं GNU C++ extensions की सूची के माध्यम क्लिक किया। मुझे कोई एक्सटेंशन नहीं मिला जो जीएनयू सी ++ में कानूनी रूप से सिंटैक्स को कानूनी रूप से कानूनी बना देगा।

हालांकि, this proposal की धारा 4 (P0428R0), सी ++ के टेम्प्लेटेड lambdas जोड़ने का प्रस्ताव है जिसके अनुसार, जीसीसी ऊपर उल्लिखित कागज के एक प्रयोगात्मक कार्यान्वयन 2009 में मिला यह शायद यही कारण है जीसीसी यहां शिकायत नहीं है।

+4

प्रश्न को देखते हुए जीसीसी को ध्वजांकित किया गया है, यह इस बात के लायक है कि इस संबंध में मानक के लिए एक gnu एक्सटेंशन है या नहीं। – Vality

+1

@ वैलिटी सहमत, जोड़ा। धन्यवाद। –

+0

मैंने जीसीसी को एक मुद्दा खोला है, क्या इसका उल्लेख करने लायक है? – skypjack

2

ऐसा लगता है कि यह एक जीसीसी एक्सटेंशन (टेम्पलेटेड लैम्बडास) है।

#include <iostream> 

int main() { 
    auto l = []<typename T>(T const& x){ std::cout << __PRETTY_FUNCTION__ << " " << x << std::endl;}; 
    l(42); 
    l("Hello world"); 
} 

परिणामों में

main()::<lambda(const T&)> [with T = int] 42 
main()::<lambda(const T&)> [with T = char [12]] Hello world 
+0

क्या आप इस दस्तावेज के लिए एक लिंक प्रदान कर सकते हैं? मैं इसे खोजने में सक्षम नहीं हूं और इसलिए मैंने विस्तार होने की संभावना को छोड़ दिया है। धन्यवाद। – skypjack

+0

http://gcc.gnu.org/ml/gcc/2009-08/msg00174.html निकटतम मैं @skypjack ढूंढ सकता हूं – etarion

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