Consulta del nombre dependiente del argumento

En el C ++ lenguaje de programación, la consulta dependiente del argumento (ADL) o consulta del nombre dependiente del argumento, se aplica a la consulta de un nombre de función no calificado según los tipos de los argumentos dados a la llamada a la función. Este comportamiento también se conoce como la consulta de Koenig, nombrada por su inventor Andrew Koenig.

ADL sólo ocurre si la consulta normal de un nombre no calificado no puede encontrar una función del miembro de la clase que hace juego. En este caso, otro namespaces no considerado durante la consulta normal se puede buscar donde el juego de namespaces para buscarse depende de los tipos de los argumentos de función. Expresamente, el juego de declaraciones encontradas por la consulta y consideradas para la resolución del nombre de función es la unión de las declaraciones encontradas por la consulta normal con las declaraciones encontradas mirando en el juego de namespaces asociado con los tipos de los argumentos de función.

Namespaces asociado por el tipo

El juego de namespaces asociado para cualquier tipo es el alcance estructural de (que puede ser usado para localizar al amigo funciones) y el namespace donde se define, si está un tipo de la estructura, juntos con el namespaces asociado con los tipos de la estructura necesarios para definir el tipo, excluyendo los tipos necesarios sólo para definir a miembros. Este juego de namespaces asociado se incluye para resolver una consulta de llamada a la función con un argumento de tipo.

Ejemplo

Un ejemplo de ADL parece a esto:

namespace NS

{\

clase A {};

vacío f (Un *&, intervalo) {}\

}\

intervalo principal

{\

NS:: Un *a;

f (a, 0);//llama NS:: f

}\

</fuente>

Un modelo común en el C ++ la Biblioteca Estándar debe declarar a operadores sobrecargados que se encontrarán en esta manera. Por ejemplo, este programa Hello World simple no compilaría si no ADL:

  1. incluir

intervalo principal

{\

std:: cout

Utilización

Note que esto es una función pero necesita la calificación llena, ya que se usa

como un argumento a

Interfaces

Dentro de C ++, las funciones encontradas por ADL se consideran la parte del interfaz de una clase. Dentro de la Biblioteca de la Plantilla Estándar, varios algoritmos hacen el uso de llamadas no calificadas a desde dentro el namespace. Como consiguiente, la función genérica se usa si nada más se encuentra, pero si estos algoritmos se usan con una clase del tercero, se encuentran en otro namespace que también contiene, esa sobrecarga de se usará.

Crítica

Mientras ADL lo hace práctico para funciones definido fuera de una clase para comportarse como si eran la parte del interfaz de esa clase, hace namespaces menos estricto y tan puede requerir el uso de nombres totalmente calificados cuando no serían por otra parte necesarios. Por ejemplo, el C ++ biblioteca estándar hace el uso extensivo de llamadas no calificadas a cambiar dos valores. La idea consiste en que entonces uno puede definir una propia versión de std:: cambio en propio namespace de alguien y se usará dentro de los algoritmos STL. En otras palabras, el comportamiento de

mayo o puede no ser lo mismo como el comportamiento de

utilización std:: cambio;

cambio (a, b);

</fuente>

(donde y son del tipo) porque si existe, los segundos de los susodichos ejemplos lo llaman mientras el primer no va. Además, si por la razón que sea ambos y se definen, entonces el primer ejemplo llamará pero el segundo no compilará porque sería ambiguo.

En general, la sobredependencia en ADL puede llevar a problemas semánticos. Si una biblioteca, espera llamadas no calificadas a tener el sentido del que y otra biblioteca, espera que esto tenga el otro, entonces namespaces pierden su utilidad. Si, sin embargo, espera tener el sentido del que y hace igualmente, entonces no hay ningún conflicto, pero llama a se tendría que totalmente calificar (es decir a diferencia de) no sea que ADL entren en el camino.

Enlaces externos

¿

Buscar