एक दोस्त और मैं सी ++ टेम्पलेट्स पर चर्चा कर रहे थे। उसने मुझसे पूछा कि यह क्या करना चाहिए:सी ++ टेम्पलेट अस्पष्टता
#include <iostream>
template <bool>
struct A {
A(bool) { std::cout << "bool\n"; }
A(void*) { std::cout << "void*\n"; }
};
int main() {
A<true> *d = 0;
const int b = 2;
const int c = 1;
new A<b> (c) > (d);
}
मुख्य में अंतिम पंक्ति में दो उचित पार्स हैं। टेम्पलेट तर्क 'बी' है या b > (c)
टेम्पलेट तर्क है?
हालांकि, यह संकलित करने के लिए तुच्छ है, और देखें कि हमें क्या मिलता है, हम सोच रहे थे कि अस्पष्टता क्या हल करती है?
लेकिन lexing पूरी तरह से स्पष्ट नहीं है? –
यह अस्पष्टता पर त्रुटि होगी, इसलिए हां। लालची या गैर लालची होने से आपको अस्पष्ट नहीं होता है। लालची वास्तव में अस्पष्टता को हल करने का एक तरीका है। आप इस मामले में लेक्सर और पार्सर के बीच बातचीत में भी आते हैं, तो शायद यह पार्सर है जो लालची नहीं है। –
व्याकरण संदिग्ध हो सकता है, लेकिन लेक्सर बिल्कुल नहीं है। अंतराल लेक्सर को पूरी तरह से परिभाषित करता है। –