c++ rules name-resolution

Lista de reglas de resolución de nombres de C++(y sobrecarga)



rules name-resolution (1)

Bueno, a grandes rasgos:

  • Si el nombre va precedido por :: , como en ::A o X::A , utilice la búsqueda de nombre calificado . Primero busque X , si existe (si no usa el espacio de nombres global), luego busque en su interior A Si X es una clase y A no es un miembro directo, entonces busca en todas las bases directas de X Si A se encuentra en más de una base, falla.

  • De lo contrario, si el nombre se usa como una llamada de función como A( X ) , use la búsqueda dependiente del argumento . Esta es la parte difícil. Busque A en el espacio de nombres en el que se declaró el tipo de X , en los amigos de X , y si X es un ejemplo de plantilla, igualmente para todos los argumentos involucrados. Los ámbitos asociados solo por typedef no aplican. Haga esto además de la búsqueda no calificada.

  • Comience con una búsqueda no calificada si la búsqueda dependiente de un argumento no se aplica. Esta es la forma habitual en que se encuentran las variables. Comience en el alcance actual y trabaje hacia afuera hasta que se encuentre el nombre. Tenga en cuenta que esto respeta el using namespace directivas de using namespace , que no lo hacen los otros dos casos.

El simple hecho de echar un vistazo al Estándar revelará muchas excepciones y errores. Por ejemplo, la búsqueda no calificada se usa para determinar si el nombre se usa como una llamada de función, en lugar de una expresión de conversión, antes de que se use ADL para generar una lista de posibles sobrecargas. La búsqueda no calificada no busca objetos en los ámbitos de anidado de clases locales anidadas, ya que es posible que dichos objetos no existan en el momento de la referencia.

Aplique el sentido común y haga preguntas más específicas cuando (como suele suceder) la intuición falla.

¿Dónde puedo encontrar una lista de las reglas que debe aplicar un compilador compatible con C ++ para realizar la resolución de nombres (incluida la sobrecarga)?

Me gustaría algo como un algoritmo de lenguaje natural o un diagrama de flujo.

El estándar de C ++, por supuesto, tiene este conjunto de reglas, pero se construye a medida que se introducen nuevas declaraciones de lenguaje y el resultado es bastante difícil de recordar.

Para resumir la historia, me gustaría saber la respuesta completa y detallada a la pregunta " ¿Qué hace el compilador cuando ve el nombre ''A'' ?"

Sé que C ++ es todo " Hacemos esto cuando X pero no Y si Z se mantiene ", así que estoy preguntando si es posible hacerlo más lineal.

EDITAR : Estoy trabajando en un borrador de este tema, algo que puede mejorarse colectivamente una vez publicado. Sin embargo, estoy muy ocupado en estos días y puede llevar tiempo publicar algo. Si alguien interesado, promoveré la "nota personal en un archivo txt en bruto" para algo mejor y lo publicaré.