¿Se pueden definir los miembros de la clase fuera del espacio de nombres en el que se declaran?

A veces encuentro código como el siguiente (en realidad, algunos asistentes de clase crean dicho código):

// C.h
namespace NS {

class C {
    void f();
};

}

y en el archivo de implementación:

// C.cpp
#include "C.h"

using namespace NS;
void C::f() {
  //...
}

Todos los compiladores que probé aceptan ese tipo de código (gcc, clang, msvc, compileonline.com). Lo que me hace sentir incómodo es elusing namespace NS;. Desde mi punto de vistaC::f() vive en el espacio de nombres global en un entorno que tiene acceso no calificado a objetos que viven en el espacio de nombres NS. Pero en opinión del compiladorvoid C::f() vive ennamespace NS. Como todos los compiladores que probé comparten ese punto de vista, probablemente tengan razón, pero ¿en qué parte del estándar está respaldada esta opinión?

Respuestas a la pregunta(1)

Su respuesta a la pregunta