2011-11-26 2 views
6

मुझे यह समझ नहीं है:क्या 'वैकल्पिक व्याकरण' करता है [[गुणों के अलावा दिखाई देता है?

(7.6.1) दो लगातार बाईं वर्ग कोष्ठक टोकन दिखाई जाएगी केवल जब एक विशेषता-विशिष्ट एर शुरू। [नोट: यदि लगातार दो बाएं स्क्वायर ब्रैकेट दिखाई देते हैं जहां एक विशेषता-विशिष्टता की अनुमति नहीं है, प्रोग्राम बीमार है भले ही ब्रैकेट वैकल्पिक व्याकरण उत्पादन से मेल खाते हैं। अंत टिप्पणी] [उदाहरण: (थोड़ा स्रोत से संशोधित)

// ... 
void f() { 
int x = 42, y[5]; 
    // ... 
    y[[] { return 2; }()] = 2; // error even though attributes are not allowed 
          // in this context. 
} 

क्या वैकल्पिक व्याकरण [[ के लिए इस्तेमाल किया जा सकता है? उदाहरण मौजूद होंगे यदि विशेषता मौजूद नहीं है (और उदाहरण क्या करता है)?

+4

मुझे लगता है यह '' >> असफलता की तरह खत्म हो सकता है: तकनीकी रूप से एक विशिष्ट तरीके से पार्स किया जा करने के लिए आवश्यक है, लेकिन समय के साथ उदारता पैदा होगा और मानक बाधा आराम कर सकते हैं। उस ने कहा, बड़ी संख्या में स्थितियों के गुणों का उपयोग किया जा सकता है, यह कंप्यूटर्स नौकरी को हमेशा [[''एक विशेषता-विनिर्देशक के रूप में पार्स करने के लिए आसान बनाता है (जो बदले में सुविधा को आसान बनाता है)। – GManNickG

+0

@GMan: और ऐसा लगता है कि '[['गुणों के बाहर टोकन प्राप्त करने के लिए लैम्बडास के माध्यम से कोई दूसरा रास्ता नहीं है। – Xeo

+0

@Xeo: मैं बस Ctrl + C++ 0x के व्याकरण के माध्यम से F'd और यह सच लगता है। मैं विशेषताओं में विशेषज्ञ नहीं हूं, और मुझे नहीं लगता कि यह मान्य होगा, लेकिन यहां एक विधि है जिसे लैम्ब्डा की आवश्यकता नहीं होगी: 'स्ट्रक्चर {शून्य ऑपरेटर [] (शून्य *) {}} x; एक्स [[[ब्लाह]] नया int]; '। मुझे नहीं लगता कि आप इस तरह की एक विशेषता लागू कर सकते हैं, लेकिन यह सामान्य विचार है। – GManNickG

उत्तर

2

उदाहरण एक साधारण लैम्ब्डा, जो सीधे कहा जाता है और सिर्फ 2 वापस आ जाएगी पैदा करता है। यह सरणी से तीसरा तत्व प्राप्त करेगा और इसे 2 पर असाइन करेगा। , उदाहरण के पाठ्यक्रम के लिए अच्छी तरह से गठन किया जाएगा

int foo(){ return 2; } 

int y[5]; 

y[foo()] = 2; 

या यहां तक ​​कि

int y[5]; 

auto foo = []{ return 2; }; // create lambda 

y[foo()] = 2; // call lambda 

अब, अगर गुण मौजूद नहीं था, क्योंकि खंड आप wouldn उद्धृत: इस प्रकार के रूप में लिखा जा सकता है अस्तित्व में नहीं है

+0

ओह! यह समझ आता है। यदि कोई अन्य मामला है तो मैं इसे थोड़ी देर के लिए छोड़ दूंगा। – Pubby

+3

@ पब्बी: कारण '[]' का चयन लैम्ब्डा इंड्यूसर अनुक्रम के रूप में किया गया था क्योंकि कोई वैध मामला नहीं था जहां '[' पहचानकर्ता के बिना इस्तेमाल किया जा सकता था या इसके सामने कुछ अन्य अभिव्यक्ति। तो बिना भेड़ के बच्चे, कोई रास्ता नहीं है कि [['कभी भी टोकन का वैध अनुक्रम हो सकता है। –

+5

वास्तव में '()' की एक जोड़ी जोड़ना इसे काम करने के लिए पर्याप्त होना चाहिए। 'वाई [([] {वापसी 2;}())] = 2;' – kennytm

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