2010-07-02 13 views
9

A menudo he encontrado querer deshacer el efecto de una sentencia using o incluir todo un espacio de nombres (como std) pero excluir un bit para reemplazar (como cout). Por alguna razón, esto no es posible. Me pregunto si alguien sabe por qué se decidió no agregar esta habilidad al idioma. ¿Hay alguna razón técnica? Supongo que no fue solo olvidado, ya que tampoco parece estar programado para C++ 0x.¿Por qué no hay forma de deshacer "usar" en C++?

Solo para aclarar, no estoy buscando soluciones, ya que Google puede mostrarme esas. Estoy buscando una explicación de por qué esto es imposible, y por qué no se consideró (por lo que puedo decir) para su inclusión en 0x.

+2

Les recordaría que la directiva 'using namespace' generalmente se considera una muy mala idea, podría usar perfectamente una directiva' using' para cada nombre que use con frecuencia ... y, francamente, por lo general no me molesto y solo deletrear el espacio de nombres (¿qué son 5 caracteres más?) –

+0

Para aclarar: no desea deshacer los efectos de la declaración de uso en algún momento posterior del archivo; ¿Desea especificar símbolos para excluir de la importación como parte de la propia declaración de uso? Encuentro tu elección de palabras aquí confusa. –

+0

@msteam: ¿Conoce la posibilidad de escribir directivas 'using' no solo en el alcance del archivo, sino también dentro de las funciones o bloques anidados? – fredoverflow

Respuesta

11

A usando la directiva trae un nombre o conjunto de nombres en un alcance declarativo dado.

No se puede "des-uso" por la misma razón que no se puede decir

int x = 42; 
// and later 
[remove name x somehow] 

No hay manera de unintroduce nombres de un ámbito en absoluto en C++, sin importar donde esos nombres provenían de .

Dado que complicaría en exceso la búsqueda de nombres (dado que los nombres podrían agregarse y eliminarse de un alcance), a menos que exista un caso de uso convincente, es poco probable que se considere una función de idioma potencial.

+4

Además, usted no usaría 'using' en primer lugar si no desea que se aplique a todo el alcance. Si solo lo necesita en algunos lugares, puede prefijar manualmente el espacio de nombres para cada aparición. – casablanca

+0

Existe una buena razón técnica para no permitirle eliminar o reemplazar nombres en un ámbito: vincular. La forma destrozada de namespace :: x solo puede referirse a una sola dirección. Sin embargo, esto no se aplica a los nombres que se arrastran a un espacio de nombres, ya que aún quedarían destrozados con su espacio de nombres original. No tendría que complicar la búsqueda. Si algo como "usar namespace std excepto (cout, cerr);" eran posibles (como lo es en algunos otros idiomas) esos nombres nunca habrían estado en el espacio de nombres actual para que no tengan que ser eliminados. – mstearn

+0

@mstearn: el uso de directivas no tiene nada que ver con los enlaces; solo afectan la búsqueda de nombres. En realidad, no agregan cosas (funciones u objetos) a un alcance declarativo, solo permiten buscarlos como si estuvieran en ese ámbito declarativo. De todos modos, no hay un buen caso de uso para esto, lo que significa que no existe la posibilidad de que se considere una característica de lenguaje potencial (aunque, quién sabe: de alguna manera 'std :: error_code' lo convirtió en C + + 0x, e IMO realmente no hay un caso de uso particularmente bueno para eso, al menos no en la forma en que se implementa). –

1

Sobre todo porque no son soluciones que sean lo suficientemente simple y sencillo que prácticamente nada se ganaría mediante la inclusión de una "característica" para ese propósito específico. Aunque no estoy seguro de que alguna vez lo diga directamente, creo que podría argumentar que una de las directrices en el diseño de C++ siempre ha sido preferir los mecanismos generales a los de uso especial, por lo que se usa el sistema de alcance existente (por ejemplo) tiene más sentido que agregar alguna forma especial para eliminar algo de un alcance después de que se ha introducido.

2

Esto se debe a que la directiva using no se debe usar para el código nativo de C++. Tenía la intención de ayudar a migrar el código C a C++. En este contexto, "no usar" no tiene sentido.

-edit- Debería haber sido más específico. En este caso particular, parece que mstearn está usando la directiva using para incluir el espacio de nombres estándar globalmente. Hacer esto generalmente es una mala idea porque da como resultado la contaminación global del espacio de nombres, y solo debe hacerse en ciertas circunstancias, como la transición de otro idioma a C++.

Existen otras situaciones en las que la utilización de la directiva using está bien (dentro de una función, composición del espacio de nombres). Sin embargo, "no usar" tampoco tiene sentido en estas situaciones.

+1

No estoy muy seguro de lo que se supone que significa esto. Tal vez pueda aclarar lo que quiere decir que _ "usar directivas_ no debe usarse ...? –

+0

@James McNellis Good call (+1) – aCuria

+0

@James McNellis No hay una buena razón para hacer" usar std, cout "en vez que "std :: cout" que no sea el código existente que podría clasificar con un nuevo uso y es posible que desee envolver en un espacio de nombres. –

Cuestiones relacionadas