guidelines - Resultados contradictorios entre GCC y clang relacionados con[basic.link]/7 en el estándar de C++
c++ best practices (2)
Me parece bastante claro desde [basic.link]/7
... Sin embargo, tal declaración no introduce el nombre del miembro en su ámbito de espacio de nombres.
que clang esta mal Del mismo modo no esperarías que esto se compile:
namespace A
{
}
void A::foo()
{
}
Este fragmento se compila en clang,
namespace A {
void f() {
void g();
g();
}
}
void A::g() { }
pero GCC solo acepta el código si g
está definido dentro del espacio de nombres A
siguiente manera:
namespace A {
void f() {
void g();
g();
}
void g() {}
}
Pero creo que no hay nada en [basic.link] / 7 deshabilitando el primer fragmento de código anterior.
[basic.link] / p7, énfasis mío:
Cuando no se encuentra que una declaración de ámbito de bloque de una entidad con enlace se refiera a alguna otra declaración, entonces esa entidad es un miembro del espacio de nombres que lo más interno. Sin embargo, tal declaración no introduce el nombre del miembro en su ámbito de espacio de nombres.
[namespace.memdef] / p2, énfasis mío:
Los miembros de un espacio de nombres con nombre también se pueden definir fuera de ese espacio de nombres por calificación explícita (3.4.3.2) del nombre que se está definiendo, siempre que la entidad que se está definiendo ya se haya declarado en el espacio de nombres y la definición aparezca después del punto de declaración en un espacio de nombres que encierra el espacio de nombres de la declaración .
GCC es correcto. Tu primer fragmento está mal formado.