variable initialize compiler c++ static c++11 standards

compiler - initialize static member c++



Desprecio de la palabra clave estática... ¿no más? (3)

Desaprobado o no, eliminar esta función de idioma rompería los códigos existentes y molestaría a las personas.

Todo el asunto de la desaprobación estática era solo una ilusión en la línea de "espacios de nombres anónimos son mejores que estáticos" y "las referencias son mejores punteros". Lol.

En C ++, es posible usar la palabra clave static dentro de una unidad de traducción para afectar la visibilidad de un símbolo (ya sea una declaración de función o variable).

En n3092, esto estaba en desuso:

Anexo D.2 [depr.static]
El uso de la palabra clave estática está en desuso al declarar objetos en el ámbito del espacio de nombres (ver 3.3.6).

En n3225, esto ha sido eliminado.

El único artículo que pude encontrar es algo informal.

Sí subraya, sin embargo, que para la compatibilidad con C (y la capacidad de compilar C-programs como C ++) la desaprobación es molesta. Sin embargo, compilar un programa C directamente como C ++ puede ser una experiencia frustrante, por lo que no estoy seguro si merece consideración.

¿Alguien sabe por qué fue cambiado?


En C ++ Standard Core Informes de defectos del lenguaje y Cuestiones aceptadas, Revisión 94 en 1012. Despreocimiento de `notas estáticas '':

Aunque 7.3.1.1 [namespace.unnamed] indica que el uso de la palabra clave estática para declarar variables en el ámbito del espacio de nombres está obsoleto porque el espacio de nombres sin nombre proporciona una alternativa superior, es poco probable que la característica se elimine en cualquier punto en el futuro previsible .

Básicamente, decir que la depreciación de static 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 quiere declarar una función u objeto con enlace interno.


Trataré de 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 bastante buenas respuestas. La razón por la que deseo responder es que se relaciona con cuestiones fundamentales de la evolución estándar y el diseño del lenguaje cuando el idioma se basa en un idioma existente: ¿ cuándo deberían las características del lenguaje dejar de funcionar, eliminarse o modificarse de formas incompatibles?

En C ++, es posible usar la palabra clave estática dentro de una unidad de traducción para afectar la visibilidad de un símbolo (ya sea una declaración de función o variable).

El enlace en realidad.

En n3092, esto estaba en desuso:

La depreciación indica:

  • La intención de eliminar alguna característica en el futuro; esto no significa que las características obsoletas se eliminarán en la próxima revisión estándar, o que deben eliminarse "pronto", o en absoluto. Y las características no desaprobadas pueden eliminarse en la próxima revisión estándar.
  • Un intento formal de desalentar su uso .

El último punto es importante. Aunque nunca hay una promesa formal de que su programa no se rompa, a veces silenciosamente, para el siguiente estándar, el comité debe tratar de evitar la ruptura del código "razonable". La depreciación debería decirles a los programadores que no es razonable depender de alguna función .

Sí subraya, sin embargo, que para la compatibilidad con C (y la capacidad de compilar C-programs como C ++) la desaprobación es molesta. Sin embargo, compilar un programa C directamente como C ++ puede ser una experiencia frustrante, por lo que no estoy seguro si merece consideración.

Es muy importante conservar un subconjunto común de C / C ++, especialmente para los archivos de encabezado. Por supuesto, las declaraciones globales static son declaraciones de símbolos con enlaces internos y esto no es muy útil en un archivo de encabezado.

Pero el problema nunca es solo la compatibilidad con C, es compatibilidad con C ++ existente: hay toneladas de programas válidos de C ++ que usan declaraciones globales static . Este código no es solo formalmente legal, es sólido, ya que utiliza una función de idioma bien definida de la manera en que está destinado a ser utilizado .

El hecho de que ahora hay una "mejor manera" (según algunos) para hacer algo no hace que los programas escritos a la antigua usanza sean "malos" o "irrazonables". La capacidad de utilizar la palabra clave static en las declaraciones de objetos y funciones en el ámbito global se entiende 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 a double a static_cast<double> solo porque "los moldes de estilo C son malos", ya que static_cast<double> agrega cero información y cero seguridad.

La idea de que cada vez que se invente una nueva forma de hacer algo, todos los programadores se apresuren a reescribir su código de trabajo bien definido es simplemente una locura. Si desea eliminar todos los problemas y fallas heredados de C, no cambia C ++, inventa un nuevo lenguaje de programación. La mitad de eliminar un uso de static difícilmente hace C ++ menos C-feo.

Los cambios de código necesitan una justificación, y "lo viejo es malo" nunca es una justificación para los cambios de código.

Los cambios de lenguaje de última hora necesitan una justificación muy fuerte. Hacer el lenguaje un poco más simple nunca es una justificación para un cambio radical.

Las razones dadas por las cuales static es malo son notablemente débiles, y ni siquiera está claro por qué no tanto los objetos como las declaraciones de funciones están desaprobados en conjunto, dándoles 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: no tuvo exactamente ninguna consecuencia práctica. Pero porque muestra una clara falta de sentido común por parte del comité de ISO.