2016-09-09 18 views
9

एक सबस्क्रिप्ट ऑपरेटर में लैम्ब्डा होने से g ++ और clang के लिए काम नहीं कर रहा है।लम्बाडा सबस्क्रिप्ट इटरेटर

क्या यह एक कार्यान्वयन त्रुटि या सी ++ मानक में "दुखी" नियम है?

उदाहरण:

class A 
{ 
    public: 
     template<typename T> void operator[](T) {} 
     template<typename T> void operator()(T) {} 
}; 

int main() 
{ 
    A a; 
    a[ [](){} ]; // did not compiler: see error message 
    a([](){}); // works as expected 
} 

त्रुटि:

main.cpp:13:6: error: two consecutive '[' shall only introduce an attribute before '[' token 
    a[ [](){} ]; 
    ^ 
main.cpp:13:15: error: expected primary-expression before ']' token 
    a[ [](){} ]; 

मैं जानता हूँ कि जिम्मेदार बताते हैं कि "[[" लेकिन मुझे लगता है कि "[[" (साथ एक या अधिक सफेद रिक्त स्थान) सोच रहा हूँ भी साथ शुरू होता है काम करता है:

void func(int x [ [gnu::unused] ]) {} // compiles fine! :-(

उत्तर

4

यह [dcl.attr.grammar] में शामिल है के साथ तर्क लपेट कर सकते हैं।

Two consecutive left square bracket tokens shall appear only when introducing an attribute-specifier or within the balanced-token-seq of an attribute-argument-clause. [ Note: If two consecutive left square brackets appear where an attribute-specifier is not allowed, the program is ill-formed even if the brackets match an alternative grammar production. —end note ][ Example:

int p[10]; 
void f() { 
    int x = 42, y[5]; 
    int(p[[x] { return x; }()]); // error: invalid attribute on a nested 
           // declarator-id and not a function-style cast of 
           // an element of p. 
    y[[] { return 2; }()] = 2;  // error even though attributes are not allowed 
           // in this context. 
    int i [[vendor::attr([[]])]]; // well-formed implementation-defined attribute. 
} 

—end example ]

+1

और अतिरिक्त सफेद जगहों के साथ या बिना "निरंतर" अर्थ है? – Klaus

+1

@ क्लोस सी ++ व्हाइटस्पेस संवेदनशील नहीं है। '>> 'उसमें एक अपवाद था जिसे टोकन माना जाता था, लेकिन कोई' [[' टोकन नहीं है। – Barry

+1

कल मैंने सीखा कि 'टेम्पलेट <> डबल बी :: var = 1.123; 'अमान्य है, लेकिन' टेम्पलेट <> डबल बी :: var = 1.123; 'काम करता है। केवल एक सफेद जगह ... :-) – Klaus

6

आपको लैम्ब्डा को कोष्ठक में संलग्न करना होगा। अन्यथा संकलक एक विशेषता प्रस्तुत करने के रूप में दो [[ मानता है।

ऑपरेटर हटाने का उपयोग करने के साथ एक ही समस्या हो सकती है। उदाहरण के लिए आप लिखने की

delete ([] { return (new int()); }()); 

या

delete [] ([] { return (new int[10]); }()); 

है कि आप कोष्ठक में लैम्ब्डा संलग्न करना होगा।

+0

अन्य संदर्भ से इन उत्सुक उदाहरण देखने के लिए महान: तो तुम parantheses में लपेट या अपने इरादे स्पष्ट कर देना कुछ और करना होगा लगातार दो [ के बाद, एक विशेषता है। धन्यवाद – Klaus

1

आप कोष्ठकों

a[ ([](){}) ]; 
+0

अब विचार करें कि पहले यहां कैसे था :-): कामकाज देखने में अच्छा लगा। लेकिन किसी को भी यह विचार मानक द्वारा इरादा है? '[[' 'के गुणों की शुरुआत को ठीक करने से उस समस्या को हटा दिया जाएगा। Thats क्यों मैंने पूछा कि यह कार्यान्वयन या "दुर्भाग्यपूर्ण" मानक टूट गया है। – Klaus

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