c ++ usando declaración, alcance y control de acceso

Normalmente, la declaración de 'uso' se usa para poner en alcance algunas funciones miembro de las clases base que de otro modo estarían ocultas. Desde ese punto de vista, es solo un mecanismo para hacer que la información accesible sea más cómoda de usar.
Sin embargo: la declaración de 'uso' también se puede usar para cambiar las restricciones de acceso (no solo para funciones sino también para atributos). Por ejemplo:

class C{
public:
  int a;
  void g(){ cout << "C:g()\n"; }
  C() : a(0){}
};

class D : public C{
private:
  using C::a;
  using C::g;
public:
  D() { a = 1; }
};

int main(void){
  D d;
  cout << d.a << endl;  //error: a is inaccessible
  C *cp = &d;
  cout << cp->a << endl; //works
  d.g();  //error: g is inaccessible
  cp->g();  //works
  return 0;
}

Creo que esta limitación de acceso en la clase derivada en realidad no sirve, porque siempre se puede acceder a g () y a desde un puntero a la clase base. Entonces, ¿no debería haber al menos algún tipo de advertencia del compilador? ¿O no habría sido aún mejor prohibir tal limitación de acceso por parte de una clase derivada? La declaración de uso no es la única posibilidad de agregar restricciones de acceso. También se podría hacer anulando una función de clase base y colocándola en una sección con más restricciones de acceso. ¿Hay algunos ejemplos razonables en los que sea realmente necesario limitar el acceso de tal manera? Si no, no veo por qué debería estar permitido.

Y otra cosa: al menos con g ++, el mismo código compila bien sin la palabra 'usar'. Eso significa que para el ejemplo anterior: es posible escribir C :: a; y C :: g; en lugar de usar C :: a; utilizando C :: g; ¿El primero es solo un atajo para el segundo o hay algunas diferencias sutiles?

//EDITAR:
así que de la discusión y las respuestas a continuación, mi conclusión sería:
- Está permitido limitar las restricciones de acceso en clases derivadas con herencia pública.
- Hay ejemplos útiles donde se podría usar.
- su uso podría causar problemas en combinación con plantillas (por ejemplo, una clase derivada ya no podría ser un parámetro válido para alguna clase de plantilla / función, aunque su base es)
- Un diseño de lenguaje más limpio no debe permitir tal uso.
- el compilador podría al menos emitir algún tipo de advertencia

Respuestas a la pregunta(3)

Su respuesta a la pregunta