Un amigo y yo estábamos discutiendo las plantillas C++. Me preguntó qué debería hacer esto:Ambigüedad de la plantilla C++
#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);
}
La última línea en main tiene dos análisis razonables. ¿Es 'b' el argumento de la plantilla o es b > (c)
el argumento de la plantilla?
Aunque, es trivial compilar esto, y ver lo que obtenemos, nos preguntamos ¿qué resuelve la ambigüedad?
Pero no es el léxico completamente inequívoca? –
Error en la ambigüedad, entonces sí. Ser codicioso o no codicioso no te hace ambiguo. La codicia es en realidad una forma de resolver la ambigüedad. En este caso, también entres en la interacción entre el analizador y el analizador, por lo que tal vez el analizador sintáctico no sea codicioso. –
La gramática puede ser ambigua, pero el lexer no lo es en absoluto. El espaciado hace que el lector esté completamente bien definido. –