Nota: Creo que mi respuesta anterior estaba mal no es Koenig Lookup es decir Argumento dependiente de búsqueda de nombres (ADL) Así que he borrado mi respuesta (anterior), ya que me encontré con la sección correspondiente de la Norma, que responde a su.. pregunta
Su c ode es directamente de la sección §9.4/2 del estándar C++ 03.
Un miembro estático puede ser denominado directamente en el alcance de su clase o en el ámbito de una clase derivada (cláusula 10) de su clase; en este caso , el miembro estático se denomina como si se utiliza una expresión calificado-id, con el anidado de nombre especificador del calificado-id nombrar el ámbito de clase de la que el miembro estático es referencia.
A continuación, facilita este ejemplo (que lo solicitado en la pregunta)
[Example:
int g();
struct X {
static int g();
};
struct Y : X {
static int i;
};
int Y::i = g(); // equivalent to Y::g();
—end example]
Se dice entonces que, en el apartado 9.4/3
Si un rotundo-id (5.1) se utiliza en la definición de un miembro estático siguiente declarador-id del miembro, y búsqueda de nombres (3.4.1) encuentra que la sin reservas-id se refiere a un miembro estático, empadronador, o tipo anidado de la clase del miembro (o de una clase base de la clase del miembro), el sin reservas-id se transforma en una expresión calificado-id en la que el nombre-anidado-especificador nombra el clas s ámbito desde el que el miembro es con referencia.
Dado que sucede única en la definición del miembro estático, eso significa Y::g()
sólo se llama en el inicialización, no en asignación:
//definition-cum-initialization
int Y::i = g(); // equivalent to Y::g();
int main()
{
//assignment
Y::i = g(); // does not equivalent to Y::g(); it calls global g()
}
ver la salida aquí: http://www.ideone.com/6KDMI
Consideremos otro ejemplo:
struct B{};
B f();
namespace NS
{
struct A { static B b;};
B f();
}
//Definition cum Initialization
B NS::A::b = f(); //calls NS::f()
B b = f(); //calls global f()
int main()
{
//Assignment
NS::A::b = f(); //calls global f()
b = f(); //calls global f()
}
Ver la demo completa aquí: http://www.ideone.com/53hoW
Si desea que el uso de la función global ':: g()' –