2016-11-11 11 views
7

यह संकलित:[] mutable {} क्यों संकलित नहीं करता है?

[]{}; 

यह रूप में अच्छी तरह:

[]() mutable {}; 

लेकिन इस कोड के साथ, compilers मुझ पर त्रुटि संदेश फेंक:

[] mutable {}; 
    ^~~~~~~ 
error: lambda requires '()' before 'mutable' 

कोई विशेष कारण है कि है?

+2

@ बामाइटएगेन मानक पढ़ने और समझने के लिए यह एक कौशल है (विशेष रूप से यदि अंग्रेजी आपकी पहली भाषा नहीं है), तो ऐसे प्रश्न पूछना ठीक है IMHO। – Slava

+0

@ बाममितएगेन मैं सोच रहा था, अगर कोई विशेष कारण है, मानक इस तरह से निर्दिष्ट करता है। यदि नहीं, तो हाँ, मैं इसे बदलना चाहता हूं, क्योंकि अब मैंने कई बार इस पर ठोकर खाई है। –

+0

@RalphTandetzky मैं एक अच्छे कारण के बारे में नहीं सोच सकता, संभवतः एक निरीक्षण। इसे बदलने के लिए एक प्रस्ताव लिखें! – TartanLlama

उत्तर

5

यह मानक में व्याकरण के तरीके के परिणाम का एक परिणाम है। मुझे नहीं पता कि यह एक निरीक्षण है या नहीं।

एक लैम्ब्डा अभिव्यक्ति लैम्ब्डा परिचयकर्ता (ब्रैकेट) के साथ शुरू होती है, इसके बाद वैकल्पिक लैम्ब्डा घोषणाकर्ता होता है।

लैम्ब्डा घोषणाकर्ता में तर्क सूची, उत्परिवर्तनीय, विशेषताओं, अपवाद विनिर्देशक और वापसी प्रकार शामिल हैं। तर्क सूची को छोड़कर ये सभी वैकल्पिक हैं। तो यदि एक लैम्ब्डा घोषणाकर्ता बिल्कुल मौजूद है, तो कोष्ठक वहां होना चाहिए।

यही कारण है कि आप केवल म्यूटेबल कीवर्ड नहीं कर सकते हैं।

1

n4296 (जो सी ++ 14 अंतिम मसौदा है) में धारा 5.1.2 [expr.prim.lambda] में देख रहा है, यह व्याकरण से निकलने का तरीका है। mutable केवल लैम्ब्डा-घोषणाकर्ता में अनुमति है - जिसमें ब्रैकेट शामिल हैं। पूरे लैम्ब्डा-घोषणाकर्ता वैकल्पिक है (यही कारण है कि आप ब्रैकेट को छोड़ सकते हैं)।

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