c++ - sirve - using namespace std que es
¿Por qué GCC permite llamar a esta función sin usar primero su espacio de nombres? (1)
Posible duplicado:
¿Por qué el alcance del parámetro C ++ afecta la búsqueda de funciones dentro de un espacio de nombres?
Hoy he experimentado este extraño comportamiento. Puedo llamar a extrañoFn sin using namespace Strange
primero, pero no puedo llamar a extrañoFn2 ¿Por qué?
namespace Strange
{
struct X
{
};
void strangeFn(X&) {}
void strangeFn2(int) {}
}
int main()
{
Strange::X x;
strangeFn(x); // GCC allows calling this function.
strangeFn2(0); // Error: strangeFn2 is not declared in this scope.
return 0;
}
¿Cómo resuelven los compiladores de C ++ el alcance de los símbolos?
Esto se denomina búsqueda dependiente de argumentos (o búsqueda Koenig)
Básicamente, si un símbolo no se pudo resolver, el compilador buscará en los espacios de nombres de los argumentos.
La segunda llamada a la función falla, porque strangeFn2
no está visible en el espacio de nombres actual, ni está definido en el espacio de nombres de su tipo de parámetro ( int
)
Puede ver cómo funciona esto con las funciones del operador:
std::complex<double> c, d;
c += d; // wouldn''t really work without ADL
o los operadores omnipresentes de iostream:
std::string s("hello world");
std::cout << s << std::endl; // Hello world would not compile without ADL...
Por diversión, este es el aspecto que tendría hola mundo sin ADL (y sin using
palabras clave ...):
std::string s("hello world");
std::operator<<(std::cout, s).operator<<(std::endl); // ugly!
Hay casos de esquinas sombrías con ADL y resolución de sobrecarga en presencia de plantillas de funciones, pero las dejaré fuera del alcance de la respuesta por ahora.