2011-04-06 29 views
6

पर विचार करें:सी ++ वाक्य रचना अस्पष्टता

void f(std::pair<bool,bool> terms = std::pair<bool,bool>(1,1)) {} 

जीसीसी 4.4 ठीक है, जीसीसी 4.3 error: expected ',' or '...' before '>' token शिकायत। फिक्स है:

void f(std::pair<bool,bool> terms = (std::pair<bool,bool>(1,1))) {} 

क्या कारण है? क्या यह 4.3 में एक बग है?

+0

यह सबसे अप्रिय पार्स से संबंधित कुछ (http://en.wikipedia.org/wiki/Most_vexing_parse) की तरह लगता है। 'Std :: जोड़ी शब्द = std :: make_pair (सत्य, सत्य) 'के बारे में क्या? –

+1

बूलियन के लिए '1' का उपयोग क्यों करें? अंक और बूलियन मिश्रण न करें, वास्तव में:/ –

उत्तर

8

यह एक ज्ञात मुद्दा था। ऐसा लगता है कि दूसरा कॉमा पैरामीटर घोषणाओं को अलग करता है। यह इस तथ्य से आता है कि एक वर्ग परिभाषा में, फ़ंक्शन डिफ़ॉल्ट तर्क केवल पहले टोकननाइज्ड होते हैं, और उसके बाद केवल बाद में पार्स किया जाता है जब पूर्ण वर्ग निकाय पढ़ा जाता है। चूंकि यह वास्तव में डिफ़ॉल्ट तर्क का विश्लेषण नहीं करता है, यह ध्यान नहीं देता है कि अल्पविराम वास्तव में टेम्पलेट तर्क सूची के भीतर एक अल्पविराम है।

इसके बारे में कुछ पढ़ने के लिए http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#325 देखें। उद्धृत

दूसरी समस्या टोकन एकत्र करने के साथ है जो डिफ़ॉल्ट तर्क अभिव्यक्ति बनाती है। डिफ़ॉल्ट तर्क जिनमें एक से अधिक पैरामीटर वाले टेम्पलेट-आईडी होते हैं, यह तय करने में कठिनाई होती है कि डिफ़ॉल्ट तर्क कब समाप्त होता है। विचार करें,

template <int A, typename B> struct T { static int i;}; 
class C { 
    int Foo (int i = T<1, int>::i); 
}; 

डिफ़ॉल्ट तर्क में एक गैर-संश्लेषित अल्पविराम शामिल है। क्या यह आवश्यक है कि इस अल्पविराम को डिफ़ॉल्ट तर्क अभिव्यक्ति के हिस्से के रूप में देखा जाए, न कि किसी अन्य तर्क घोषणा की शुरुआत? डिफ़ॉल्ट तर्क टी के नाम देखने की आवश्यकता होगी के हिस्से के रूप में स्वीकार करने के लिए (निर्धारित करने के लिए कि '<' एक टेम्पलेट तर्क सूची का हिस्सा है और नहीं एक से कम ऑपरेटर था) से पहले सी पूरा हो गया है। इसके अलावा, अधिक रोगजनक

class D { 
    int Foo (int i = T<1, int>::i); 
    template <int A, typename B> struct T {static int i;}; 
}; 

स्वीकार करना बहुत मुश्किल होगा। भले ही टी को फू के बाद घोषित किया गया है, टी फू की डिफ़ॉल्ट तर्क अभिव्यक्ति के भीतर गुंजाइश है।

+4

सी ++ मुश्किल है: हे – Anycorn

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