2011-06-02 16 views
9

Un punto de proyecto ISO n3290 sección 3.4.2 párrafo 1:3.4.2 Argumento dependiente de búsqueda de nombre de Proyecto de n3290

Cuando el postfix-expresión en una llamada de función es un sin reservas-id, se pueden buscar otros espacios de nombres no considerados durante la búsqueda normal no calificada, y en esos espacios de nombres, se pueden encontrar declaraciones de funciones de amigo de espacio de nombres de nombres que de otro modo no serían visibles. Estas modificaciones en la búsqueda dependen de los tipos de argumentos (y para los argumentos de la plantilla de plantilla, el espacio de nombres del argumento de la plantilla).

Aquí dijeron aboout "estas modificaciones a la búsqueda dependen de los tipos/argumentos de plantilla de plantilla/espacio de nombres del argumento de plantilla" ... ¿Puede uno ampliar con un ejemplo, por favor? Probé con argumetn types..please expalin con tipos de argumentos plantilla plantilla & espacio de nombres del tipo de parámetro de plantilla

Respuesta

17

Considere una simple llamada de función no calificado:

foo(x); 

ADL significa que foo se busca no sólo en el encerrando el alcance y el espacio de nombre en el que está la llamada, pero también el espacio de nombres del tipo x. p.ej. si x es un std::vector<int>, también se buscará el espacio de nombres std. Por lo tanto:

int main() { 
    std::vector<int> x,y; 
    swap(x,y); 
} 

está bien, y se llamará std::swap().

La búsqueda también depende del espacio de nombres de los argumentos de plantilla, así que si es xstd::vector<mynamespace::myclass> continuación mynamespace también se incluye en las operaciones de búsqueda. Por lo tanto

namespace mynamespace { 
    struct myclass {}; 
    void foo(std::vector<mynamespace::myclass> const&){} 
} 

int main() { 
    std::vector<mynamespace::myclass> x; 
    foo(x); 
} 

llamará mynamespace::foo().

Finalmente, la búsqueda también se extiende a los espacios de nombres de las plantillas utilizadas como parámetros de plantilla de plantilla. p.ej.

namespace mynamespace { 
    template<typename T> 
    struct mytemplate 
    {}; 

    template<typename T> 
    void bar(T const&) {} 
} 

template<template<typename> class T> 
struct wrapper {}; 

int main() { 
    wrapper<mynamespace::mytemplate> x; 
    bar(x); 
} 

A pesar de que es wrapper en el espacio de nombres global, mynamespace::bar se encontrarán, porque el parámetro de plantilla plantilla utilizada para x es mynamespace::mytemplate.

Cuestiones relacionadas