Ein Freund und ich diskutierten C++ - Vorlagen. Er fragte mich, was das tun sollte:C++ - Vorlage Mehrdeutigkeit
#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);
}
Die letzte Zeile in Main hat zwei sinnvolle Pars. Ist 'b' das Template-Argument oder ist b > (c)
das Template-Argument?
Obwohl es trivial ist, dies zu kompilieren und zu sehen, was wir bekommen, haben wir uns gefragt, was die Mehrdeutigkeit löst?
Aber ist nicht der lexing ganz eindeutig:
Dies natürlich Korrekturen, den Ärger mit mit Leerzeichen in verschachtelten Spezialisierungen hinzufügen? –
Es wird mehrdeutig, also ja. Gierig oder nicht gierig zu sein macht dich nicht zweideutig. Gierigkeit ist eigentlich eine Möglichkeit, Mehrdeutigkeit aufzulösen. In diesem Fall geraten Sie auch in die Interaktion zwischen dem Lexer und dem Parser, also ist es vielleicht der Parser, der nicht gierig ist. –
Die Grammatik kann mehrdeutig sein, aber der Lexer ist absolut nicht. Der Abstand macht den Lexer vollständig gut definiert. –