En C ++ es posible usar la static
palabra clave dentro de una unidad de traducción para afectar la visibilidad de un símbolo (ya sea una variable o declaración de función).
En n3092, esto quedó en desuso:
Anexo D.2 [depr.static]
El uso de la palabra clave estática está en desuso cuando se declaran objetos en el ámbito del espacio de nombres (véase 3.3.6).
En n3225, esto se ha eliminado.
El único artículo que pude encontrar es algo informal.
Sin embargo, subraya que por compatibilidad con C (y la capacidad de compilar programas C como C ++), la desaprobación es molesta. Sin embargo, compilar un programa C directamente como C ++ ya puede ser una experiencia frustrante, por lo que no estoy seguro de si merece consideración.
¿Alguien sabe por qué se cambió?
Respuestas:
En C ++ Standard Core Language Defect Reports and Accepted Issues, Revisión 94 bajo 1012. Sin prejuicios estáticos , señalan:
Básicamente decir que la desaprobación de
static
realmente no tiene sentido. Nunca se eliminará de C ++, y sigue siendo útil porque no necesita el código repetitivo que necesita con espacios de nombres sin nombre, si solo desea declarar una función u objeto con enlace interno.fuente
static class ...
, OTOH, no funcionará.namespace {
" y "}
"?Intentaré responder a su pregunta, aunque es una pregunta antigua, y no parece muy importante (realmente no es muy importante en sí misma ), y ya ha recibido respuestas bastante buenas. La razón por la que quiero responder es que se relaciona con cuestiones fundamentales de la evolución estándar y el diseño del lenguaje cuando el lenguaje se basa en un lenguaje existente: ¿ cuándo se deben desaprobar, eliminar o cambiar las características del lenguaje de formas incompatibles?
El vínculo en realidad.
La obsolescencia indica:
El último punto es importante. Aunque nunca hay una promesa formal de que su programa no se romperá, a veces silenciosamente, por el siguiente estándar, el comité debe tratar de evitar romper el código "razonable". La obsolescencia debería indicar a los programadores que no es razonable depender de alguna característica .
Es muy importante conservar un subconjunto común de C / C ++, especialmente para los archivos de encabezado. Por supuesto,
static
las declaraciones globales son declaraciones de símbolo con enlace interno y esto no es muy útil en un archivo de encabezado.Pero el problema nunca es solo la compatibilidad con C, es la compatibilidad con C ++ existente: hay toneladas de programas C ++ válidos existentes que usan
static
declaraciones globales. Este código no solo es formalmente legal, es sólido, ya que utiliza una característica de lenguaje bien definida de la forma en que está destinado a ser utilizado .El hecho de que ahora haya una "mejor manera" (según algunos) de hacer algo no significa que los programas escritos a la antigua sean "malos" o "irrazonables". La capacidad de usar la
static
palabra clave en declaraciones de objetos y funciones en el ámbito global se comprende bien en las comunidades C y C ++, y la mayoría de las veces se usa correctamente.En una línea similar, no voy a cambiar los moldes de estilo C
double
astatic_cast<double>
solo porque "los moldes de estilo C son malos", ya questatic_cast<double>
agrega cero información y cero seguridad.La idea de que cada vez que se inventa una nueva forma de hacer algo, todos los programadores se apresuran a reescribir su código de trabajo existente bien definido es una locura. Si desea eliminar todos los problemas y la fealdad heredados, no cambia C ++, sino que inventa un nuevo lenguaje de programación. La eliminación de la mitad de un uso de
static
apenas hace que C ++ sea menos C-feo.Los cambios de código necesitan una justificación, y "lo antiguo es malo" nunca es una justificación para los cambios de código.
Romper los cambios de lenguaje necesita una justificación muy sólida. Hacer el lenguaje un poco más simple nunca es una justificación para un cambio radical.
Las razones dadas por las que
static
es malo son simplemente notablemente débiles, y ni siquiera está claro por qué no tanto los objetos como las declaraciones de funciones están desaprobados juntos; darles un tratamiento diferente difícilmente hace que C ++ sea más simple o más ortogonal.Entonces, realmente, es una historia triste. No por las consecuencias prácticas que tuvo: tuvo exactamente cero consecuencias prácticas. Pero porque muestra una clara falta de sentido común por parte del comité de ISO.
fuente
static
o los espacios de nombres anónimos, no estoy alentando ni desalentando tampoco. Mi punto es que si realmente quieres disuadir a las personas de que utilicen espacios de nombres anónimos, debes darles un buen argumento. En la práctica, creo que en la mayoría de las implementaciones, las entidades declaradas en un espacio de nombres sin nombre son símbolos exportados con un nombre aleatorio, aumentando así la tabla de exportación. Las entidades declaradas comostatic
OTOH no se exportan de ninguna manera. Por lo tanto, muchas personas eligen, basándose en esa observación, utilizarstatic
.static
no desaparecerá nunca, por lo que está mal desaprobarlo. " Sin embargo, no argumenta que desalentar su uso está mal " . No he visto ningún argumento convincente que demuestre que el uso del ámbito de espacio de nombresstatic
es "incorrecto". Despreciarlo solo para desalentar su uso está mal, porque nadie cree realmente que va a desaparecer y porque no convence a la gente de que usarlo es "incorrecto".En desuso o no, eliminar esta función de idioma rompería los códigos existentes y molestaría a la gente.
Todo el asunto de la desaprobación estática fue solo una ilusión en la línea de "los espacios de nombres anónimos son mejores que los estáticos" y "las referencias son mejores indicadores". Jajaja
fuente
char* foo = new char; char& ref = *foo;
hecho de que se le dé un puntero inicialmente no dice nada sobre su capacidad para usar referencias.