It recently came to my attention ese miembro funciones completamente sombra funciones gratuitas con el mismo nombre cuando dentro de la clase. Y por completo quiero decir que cada función libre con el mismo nombre no se considera en absoluto para la resolución de sobrecarga. Puedo entender por qué se hace con somwthing así:¿Por qué las funciones miembro de la clase sombrean funciones libres con el mismo nombre?
void f();
struct S
{
void f();
void g()
{
f(); // calls S::f instead of ::f
}
};
donde las funciones tienen firmas idénticas, su único natural como ámbito de las variables funciona de la misma manera. Pero ¿por qué prohibir las llamadas unambigious donde la función libre tiene diferentes firmas como esto:
void f();
struct S
{
void f(int x);
void g()
{
f(); // fails to compile attempting to call S::f, which has wrong signature
}
};
No estoy pidiendo cómo llamar a un ensombrecidos función libre desde el interior de la clase. Lo que quiero saber es la razón de ser de este diseño.
Es posible que debas preguntarle a Bjarne Stroustrup! – peacemaker
Buscar de esta manera significa que la lista de funciones candidatas generadas es siempre pequeña. Eso es bueno para los tiempos de compilación, se puede imaginar que si buscaba todos los posibles candidatos (incluyendo ADL) y había muchas plantillas, muy rápidamente se volvería muy lento. También refleja el uso y la semántica deseada en la mayoría de los casos. Normalmente cuando dices 'foo' el' foo' que estás pensando es el más cercano. Si no es el más cercano, es probable que se haya equivocado. Un error es mejor que cosas raras que suceden en el tiempo de ejecución. Mantener las cosas locales es un buen comportamiento. – Flexo
puede disfrutar de esta presentación en Búsqueda de nombres: http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of -n – MFH