Modern C ++! = (La mayoría) Nuevo estándar



El término "C ++ moderno" se usa a menudo como sinónimo de la expresión "código que usa el nuevo estándar C ++". Aquí, "nuevo" puede significar cualquier cosa, desde C ++ 11 a C ++ 17, o incluso lo que ya está disponible desde C ++ 20. Creo que C ++ moderno es algo más, no se limita a agregar el indicador -std = c ++ 17 .

¿Qué significa moderno?


Si buscamos el significado de la palabra "moderno" en la red, uno de los primeros encontraremos una definición del diccionario Merriam-Webster . Aquí hay dos partes relacionadas con C ++:

[...]

2: involucrando técnicas, métodos o ideas recientes: (modernos) métodos modernos de comunicación

3 en mayúscula: de, relacionado o que tiene las características del período actual o más reciente de desarrollo de un idioma - Inglés moderno

[...]

Las técnicas, métodos e ideas se relacionan con algo más que las nuevas características del lenguaje. A menudo, estas nuevas funciones admiten o incluyen nuevas técnicas, pero muchas de ellas han existido durante bastante tiempo. En cuanto a las características del desarrollo del lenguaje, se basan en cómo usamos el lenguaje. Esto se refiere a cómo combinamos características antiguas y nuevas, y esto es más que un simple programa C ++ en funcionamiento, o algo que está incluido en la biblioteca estándar.

Se podría argumentar que las capacidades que han existido desde C ++ 98 no son parte de C ++ moderno, porque han existido durante demasiado tiempo. Sin embargo, debe recordarse que las personas más activas en la comunidad que hablan o escriben sobre “C ++ moderno” son las más frecuentemente pioneras. La mayoría usa, estudia e incluso enseña la buena y antigua "C con clases" de los años 90, lo que hace que muchos de los métodos que no se usan allí sean parte del C ++ moderno.

Más allá de las nuevas características


¿Cuál de los disponibles en C ++ 98 considero que pertenece a la categoría de "C ++ moderno"? Aquí hay una lista parcial de algunas características e ideas importantes:

RAII


RAII significa "obtener un recurso es inicialización" o "obtener una responsabilidad es inicialización". Aunque el nombre se centra en "inicialización", la parte clave aquí es en realidad el destructor. La liberación determinista de recursos es una de las principales características de C ++ que lo distingue de la mayoría de los otros lenguajes. Para muchos, esta es la característica más importante .

RAII se puede usar para administrar de manera confiable muchas cosas, como la memoria (por ejemplo, std :: vector, std :: string ), descriptores de archivo ( std :: fstream ), conexiones de red, mutexes, conexiones de bases de datos, así como entidades que están distantemente relacionados con los recursos. Si necesita una forma confiable de realizar alguna acción, y luego cancelarla cuando salga de un alcance determinado o cuando destruya un objeto, RAII es lo que necesita.

Vi muchos códigos en los que la limpieza manual al final de las funciones se convirtió en una pesadilla. En el caso de excepciones, dicha limpieza no ocurre, por lo que en esta situación, RAII es lo que necesita . Incluso si no usa excepciones, la salida anticipada de las funciones puede mejorar significativamente su código, pero solo si no necesita limpiarlo.

La técnica RAII es definitivamente parte de C ++ moderno, aunque ha estado disponible desde el principio.

Mecanografía fuerte


La idea de escribir fuerte ha sido muy popular últimamente. En el pasado, cualquier identificador, tamaño, código postal, precio, etc., se representaba mediante int o double, u otro tipo aritmético. El hecho de que fueran compatibles, completamente ajenos entre sí, que por pura casualidad son del mismo tipo, fue una fuente de errores, pero ¿qué puedo hacer? ¡Al menos el compilador no convierte silenciosamente números y matrices en cadenas !

De hecho, resulta que el sistema de tipo C ++ y las abstracciones de costo cero * que nos proporciona el compilador pueden hacer mucho. Simplemente cree diferentes tipos de identificadores, códigos postales, tamaños (no, no typedef, gracias) y así sucesivamente. Si está interesado, consulte una de las conferencias de Björn Fahller , Jonathan Boccara o Jonathan Müller .

* (Incluso si el costo de la abstracción no es cero, demuestre que es inaceptable antes de abandonarlo)

Además de algunas adiciones recientes, <algorithm> ha estado en la biblioteca estándar desde el principio. Pero si observa el código, resulta que las personas a menudo prefieren escribir bucles manualmente. Las razones van desde no saber qué algoritmos estándar están disponibles hasta creer que "las plantillas son demasiado lentas" (a menudo sin explicación, en comparación con qué).

Programando la fase de compilación


Cosas como la metaprogramación usando plantillas se han usado desde C ++ 98. La lógica ejecutada en tiempo de compilación puede reducir significativamente la complejidad en tiempo de ejecución. En el pasado, era incómodo de usar. La sintaxis de las plantillas difiere en la dirección de la complejidad de las capacidades que se encuentran en los últimos estándares. Esto es algo así como un idioma separado que tenemos que aprender. Sin embargo, cosas como el despacho de etiquetas o los rasgos no son demasiado complicados de usar y escribir.

Sí, la mayoría de los rasgos en la biblioteca estándar aparecieron con la llegada de C ++ 11, pero escribirlos según sus necesidades no es demasiado difícil, y algunos de los más comunes estaban en Boost antes de C ++ 11. Considero que el uso de la lógica de la etapa de compilación es parte de C ++ moderno porque separa C ++ de la omnipresente "C con clases".

Conclusión


C ++ moderno no está relacionado con nuevos estándares, sino con la forma en que escribimos nuestros programas. Primero, C ++ 98 se puede escribir en un estilo más o menos moderno. En segundo lugar, "C con clases y basados ​​en rangos para bucles" aún no es C ++ moderno. Las nuevas características del lenguaje y las bibliotecas nos ayudan a escribir en el estilo de C ++ moderno, pero no hacen que nuestro código sea C ++ moderno.

Source: https://habr.com/ru/post/es429780/


All Articles