¿C ++ moderno se está volviendo más frecuente? [cerrado]

132

Cuando aprendí C ++ por primera vez hace 6-7 años, lo que aprendí fue básicamente "C con clases". std::vectordefinitivamente era un tema avanzado, algo sobre lo que podría aprender si realmente quisiera. Y ciertamente no había nadie que me dijera que los destructores podrían aprovecharse para ayudar a administrar la memoria. Hoy, a donde miro veo RAII y SFINAE y STL y Boost y, bueno, Modern C ++. Incluso las personas que recién comienzan con el idioma parecen aprender estos conceptos casi desde el día 1.

Mi pregunta es, ¿es esto simplemente porque solo estoy viendo lo "mejor", es decir, las preguntas aquí en SO y en otros sitios de programación que tienden a atraer principiantes (gamedev.net), o es esto realmente representativo de la Comunidad C ++ en su conjunto?

¿C ++ moderno se está convirtiendo realmente en el predeterminado? En lugar de ser algo elegante sobre lo que escriben los expertos, ¿se está convirtiendo en "la forma en que C ++ es"? ¿O simplemente no puedo ver a las miles de personas que todavía aprenden "C con clases" y escriben sus propias matrices dinámicas en lugar de usarlas std::vector, y hacen la administración de memoria al llamar manualmente nuevo / eliminar de su código de nivel superior?

Por mucho que quiera creerlo, parece increíble si la comunidad de C ++ en su conjunto ha evolucionado tanto en básicamente unos pocos años. ¿Cuáles son tus experiencias e impresiones?

(descargo de responsabilidad: Alguien que no esté familiarizado con C ++ podría malinterpretar el título como si C ++ estuviera ganando popularidad frente a otros lenguajes. Esa no es mi pregunta. "C ++ moderno" es un nombre común para un dialecto o estilo de programación dentro de C ++, llamado así por el libro " Diseño moderno de C ++: programación genérica y patrones de diseño aplicados ", y solo estoy interesado en esto versus" viejo C ++ ". Así que no hay necesidad de decirme que el tiempo de C ++ ha pasado, y todos deberíamos usar Python;))

jalf
fuente
2
Desafortunadamente, creo que pasará un tiempo antes de que la comunidad de C ++ en su conjunto sea lo suficientemente avanzada como para reconocer cómo usar la biblioteca estándar y aumentar junto con las próximas adiciones de C ++ 0x, mucho menos implementar código usando metodologías similares. Sin embargo, creo que C ++ 0x trae muchas esperanzas para aumentar la popularidad de C ++. Se han mejorado muchos inconvenientes sintácticos diarios. Siempre he pensado que estas cosas son insignificantes, pero para las personas externas que miran el idioma, esta es una fuente común de quejas.
stinky472
15
En mi caso, cada vez que me encuentro con un profesional que entiende las técnicas modernas de C ++ como RAII y seguridad de excepción (no necesariamente refiriéndose al libro de Alexandrescu) o incluso los conceptos más básicos como iteradores y algoritmos genéricos, encuentro diez más que no entienden. Al menos cuando se trata de profesionales, muchos de ellos están demasiado atrapados en los plazos para aprender algo que saben, por lo que incluso los autoproclamados profesionales de C ++ a menudo tienen mucho que aprender. Me temo que también me estoy convirtiendo en uno de los que tienen C ++ 0x: hay mucho que tendré que aprender y ajustar para eso y tengo plazos para cumplir.
stinky472

Respuestas:

76

Así es como creo que las cosas han evolucionado.

La primera generación de programadores de C ++ fueron programadores de C, que de hecho usaban C ++ como C con las clases. Además, el STL aún no estaba en su lugar, así que eso era esencialmente C ++.

Cuando salió el STL, eso avanzó, pero la mayoría de las personas que escribieron libros, elaboraron planes de estudio y enseñaron clases aprendieron primero C, luego esas cosas adicionales de C ++, por lo que la segunda generación aprendió desde esa perspectiva. Como señaló otra respuesta, si te sientes cómodo escribiendo regularmente para bucles, cambiar de uso std::for_eachno te compra mucho, excepto la cálida sensación difusa de que estás haciendo las cosas de la manera "moderna".

Ahora, tenemos instructores y escritores de libros que han estado usando todo C ++ y obteniendo sus instrucciones desde esa perspectiva, como Koenig & Moo's Accelerated C ++ y el nuevo libro de texto de Stroustrup. Entonces no aprendemos char*entonces std::strings.

Es una lección interesante sobre cuánto tiempo lleva reemplazar los métodos "heredados", especialmente cuando tienen un historial de efectividad.

JohnMcG
fuente
13
Si. Fue muy inteligente hacer que C ++ fuera altamente compatible con C debido a la enorme base instalada de codificadores de C. Muy similar a la exitosa estrategia de MS de mantener siempre la compatibilidad con DOS. (Excelente blog de Raymond Chen Ver las longitudes menudo dolorosos que fue a ...)
j_random_hacker
2
Vaya, hice un poco de tangente ... Quiero decir que creo que tienes razón sobre la "división generacional" entre aquellos que cambiaron de C (pero mantuvieron el pensamiento de estilo C) y aquellos cuyo "primer gusto "fue posterior a STL C ++.
j_random_hacker
57

Absolutamente sí. Para mí, si no estás programando C ++ en este estilo "C ++ moderno" como lo llamas, ¡entonces no tiene sentido usar C ++! También podría usar C. "Modern C ++" debería ser la única forma en que C ++ está programado en mi opinión, y esperaría que todos los que usan C ++ y lo hayan programado de esta manera "moderna" estén de acuerdo conmigo. De hecho, siempre estoy completamente conmocionado cuando escucho de un programador de C ++ que desconoce cosas como un auto_ptr o un ptr_vector. En lo que a mí respecta, esas ideas son básicas y fundamentales para C ++, por lo que no podría imaginarlo de otra manera.

Ray Hidayat
fuente
44
+1; Elegí el estilo "c ++ moderno" desde el principio porque es la forma natural de hacerlo (si no estás pensando en C con las clases).
Adam Hawes
21
"¿Solo usa C?" C es muy poderoso.
Clark Gaebel
44
Los robots seguramente no programarán en C ++, no son lo suficientemente estúpidos y se congelarían al intentar compilarlo.
Matt Joiner el
66
@ClarkGaebel Bueno, si C es poderoso, también lo es C ++ por su herencia de C sin sus problemas :)
legends2k
44
@rxantos, usted dice que al igual que no tenemos muchas opciones para evaluar el rendimiento, por ejemplo, ver la salida del ensamblaje, temporizadores, monitores RAM y muchos más. C ++ no es diferente de C en ese sentido. En caso de duda, perfil. Cualquier otra cosa es solo rumores.
underscore_d
25

En los días de Windows 3.1, C era el estándar. Cuando C ++ llegó al mercado de desarrolladores y luego se convirtió en el estándar ANSI, fue la nueva moda. Popularizó el acrónimo OOP y algunos de los patrones de diseño básicos que utilizan polimorfismo.

Ahora, con la mayor aceptación de las plataformas administradas de baja barrera de entrada, como C # /. NET, hay menos razones para usar C ++. Gran parte de la base de desarrolladores tendrá una opción y seamos honestos: C ++ es un oso para aprender para un novato. Con C #, puedes simplemente ejecutarlo.

Eso deja realmente solo las plataformas que NECESITAN C ++ y los evangelistas acérrimos de C ++ para continuar practicando el arte. Esta es la comunidad que necesita y quiere todas las capas de abstracción que se consideran "Modern C ++".

Entonces sí, creo que "C ++ moderno", como usted lo dice, se está volviendo más frecuente. Aunque, prevalece con un público diferente al que lo ha usado en el pasado.

Spoulson
fuente
Vamos muchachos, esta respuesta hace algunos buenos puntos. C ++ no es perfecto, todos lo sabemos, el propio Bjarne se queja de que es demasiado grande y difícil de aprender. Aunque no estoy de acuerdo sobre por qué Modern C ++ ha surgido tan gradualmente, en mi humilde opinión, solo toma tanto tiempo para que un lenguaje tan grande "retumbe".
j_random_hacker
44
Entonces, ¿estás diciendo que los desarrolladores más promedio se dirigieron a C # y tal, mientras que los más duros se quedaron más con C ++? (No es que no haya personas realmente inteligentes de C # / .NET, pero hay muchos menos inteligentes). Tiene cierto sentido.
David Thornley
3
Creo que es un punto válido. Por supuesto, no es cierto para todos, pero en gran medida, estoy de acuerdo, la mayoría de las personas que tienen una opción ya han optado por C # o Java u otros lenguajes similares.
jalf
3
Casos de uso: quiero que un cliente de Windows haga CRUD en mi base de datos. ¿Usar C # /. NET o C ++ / MFC? Quiero una aplicación web ... ¿Usar C # / ASP.NET o C ++ / ISAPI? Quiero un clon simple de "Nybbles" usando DirectX C # /. NET o C ++ / MFC / WTL? Quiero una demostración ganadora en Assembly09 ... definitivamente C ++ (vs. C #).
spoulson
8
No sé si se trata de más capas de abstracción o más dureza. Sospecho que es solo que los tipos de abstracciones disponibles a través de plantillas simplemente no estaban disponibles en Java o C #, por lo que las personas que les gustaron o las necesitaron se quedaron con C ++.
Kragen Javier Sitaker
16

Soy uno de estos tipos que aprendió a trabajar con el STL y escuchó mucho sobre RAII y las buenas prácticas de programación en C ++ desde el día 1. Parecen algunos de los libros más recomendados para aprender C ++ en la actualidad (como Accelerated C ++ y la serie Effective C ++). ) se centran en usar herramientas STL en lugar de acumular sus propias cosas, y también dan muchas "reglas" para una programación efectiva (o "moderna").

Pero hablando con amigos, también noté que algunas compañías todavía trabajan con "C con clases", no con "C ++ moderno". Tal vez la cultura propuesta por los autores y usuarios del "Modern C ++" prevalecerá algún día :)

jfsantos
fuente
Donde trabajo todavía usamos C con clases, probablemente porque hay muchos veteranos que han estado allí por un tiempo. Parecen muy cautelosos incluso con el STL, y mucho menos con BOOST.
aneccodeal
12

Creo que acabas de tener una mala experiencia al comenzar.

Necesitas conseguir libros efectivos de Scott Meyers en C ++. Empecé con C ++ con ira en 1999, el líder de mi equipo me hizo sentarme y leer C ++ efectivo y C ++ más efectivo antes de que me permitieran registrar CUALQUIER código.

La mayoría de sus consejos se refieren a "No use esta función , pero si debe hacerlo, tenga esto en cuenta"

Si sigues sus consejos, escribirás bien o "C ++ moderno".

Ahora también tiene un libro sobre STL, pero eso no lo he leído.

Binario Worrier
fuente
Debo mencionar que este fue solo mi punto de partida. Hoy, me siento muy cómodo con el STL, el boost, el RAII y todo lo demás. Simplemente me preguntaba qué tan común era mi experiencia inicial.
jalf
9

En mis trabajos en C ++, descubrí que las funciones modernas se utilizan cada vez más, y más personas me preguntaron sobre ellas en las evaluaciones y entrevistas del teléfono. Por lo que puedo decir, se están dando cuenta.

Aprendí C ++ originalmente como algo así como C con clases; Aunque el lenguaje había avanzado mucho más allá de eso, los libros que leía y las personas con las que trabajaba estaban firmemente atrapados en el "viejo C ++". RAII es algo en lo que la gente pensaría, en lugar de hacerlo automáticamente, y recuerdo haber leído algunos de los primeros artículos sobre los problemas de seguridad de excepción.

Como se señaló, ahora hay nuevos libros. Muchos de los antiguos siguen siendo relevantes, pero cada vez más parecen estar llenos de explicar por qué obviamente las malas ideas son malas. (Del mismo modo, es difícil para los lectores modernos comprender cuán revolucionarias eran las ideas de Freud sobre una mente inconsciente, ya que ahora es la sabiduría convencional).

Stroustrup acaba de publicar un libro de texto, Programación: Principios y práctica con C ++ . Lo compré porque todavía no he fallado en aprender cosas buenas de un libro de Stroustrup, pero no he pasado los primeros capítulos. Hasta ahora, todo lo que puedo decir es que apruebo la forma en que está comenzando, y al menos es una buena introducción a cómo se debe usar C ++.

David Thornley
fuente
Incluso las primeras versiones del STL no eran seguras para las excepciones.
Kragen Javier Sitaker el
2
En ese momento, nadie sabía realmente cómo escribir código seguro para excepciones. Eso se resolvió en los años posteriores a la publicación de la norma. Recuerdo algunos de los artículos en C ++ Report.
David Thornley el
7

Mientras trabajo en el proyecto en el que estoy involucrado actualmente, hay una gran cantidad de código C ++ que ha evolucionado durante un período de tiempo significativo (más de 10 años). La evolución de la que habla es claramente visible allí: el código más antiguo suele ser "C con clases": punteros sin formato, char*cadenas y uso de funciones de C asociadas, matrices, etc. el código más nuevo usa punteros inteligentes ATL y similares para administrar los recursos, pero aún se adhiere a los bucles codificados a mano la mayor parte del tiempo, y el iterador es algo raro; y el más nuevo está repleto de contenedores STL, algoritmos,shared_ptr(incluidos eliminadores personalizados para gestionar identificadores, etc.), funciones muy genéricas y plantillas de clase, etc. La mayoría de las técnicas de codificación "C con clases" tradicionales, como los punteros sin encapsular sin procesar con administración manual de por vida, están muy mal vistas en las revisiones de códigos en estos días. A juzgar por esto, parece que su observación es precisa.

El desarrollo más reciente parece ser una moda para C ++ 0x lambdas, que tiene un lado positivo en que también inclina la balanza a favor del uso de algoritmos estándar sobre bucles codificados a mano, ya que ahora puede tener todo su código en línea con algoritmos también.

Pavel Minaev
fuente
6

No diría que std :: vector califica como "moderno" en estos días. Es realmente básico.

En general, mi impresión es que las personas han adquirido algo de experiencia con el estilo moderno de C ++ y se han tranquilizado un poco. Solo para tomar un ejemplo simple, STL for_each fue interesante, pero en la práctica no agrega un gran valor terrible sobre un ciclo C simple. Es más difícil de depurar y, a veces, no proporciona el mejor rendimiento. Además, las construcciones para la programación funcional en STL actual son generalmente muy engorrosas, especialmente si tienes experiencia de un lenguaje funcional real como ML.

Johan Kotlinski
fuente
1
¿Por qué dices que el vector no califica como moderno? Sigue siendo el estado del arte para muchos casos de uso, aunque es básico. Pero creo que algo básico no significa que no sea moderno. más bien lo contrario, en todo caso. pero creo que estoy de acuerdo con tu segundo párrafo :)
Johannes Schaub - litb
44
pero creo que esto se debe a que algunas personas intentan usar for_each y amigos básicamente para todo, incluso para cosas como donde un bucle for simple sería mucho más conciso: hinchar un bucle de 2 líneas hasta 10 líneas. Sin embargo, espero que más personas usen for_each y amigos cuando lambda esté disponible en C ++ 1x
Johannes Schaub - litb
77
ser vector básico es exactamente el punto. No siempre ha sido básico. Una vez, se lo veía comúnmente como algo súper complicado (usaba PLANTILLAS) e ineficiente (no es una matriz cruda). Algo sobre lo que los expertos podrían predicar, pero muchas personas simplemente no confiaban.
jalf
2
Tal vez porque std :: for_each rara vez es lo que necesita en comparación con decir ... std :: transform? El uso del algoritmo lo ayuda a deshacerse de un error muy común: la condición de bucle incorrecta.
Edouard A.
vector <bool> ciertamente no es básico ...
Kugel
6

En mi experiencia (universidad española), desafortunadamente, la norma es no considerar los idiomas en sí mismos. Usan los lenguajes más fáciles para enseñar programación (es decir, Java), porque se supone que es fácil para maestros y estudiantes, y luego usan C para las clases de SO y demás.

C ++ se introduce muy ligeramente (en cualquier caso en cualquier curso), solo para proporcionar una C con clases. No entran en impulso o incluso STL. Creo que mantenerse al día con todas las características y la forma de pensar de C ++ es costoso tanto para maestros como para estudiantes. ¿Cuántos programadores de C ++ aquí conocen lo suficiente de todas las bibliotecas de Boost para usarlas para dar una mejor solución o para diseñarla? Uno tiene que estar interesado en mantenerse al día con todas las nuevas bibliotecas y modismos.

Sin embargo, como dije, parece que la programación en general (y los lenguajes de programación en particular) no se toman demasiado en serio, ya que parece ser una asignación temporal cuando comienzan un trabajo, luego olvidan cómo programar a medida que avanzan en el Árbol de empresa. Muchas empresas aquí, y la propia Universidad, tienen la sensación de que cualquiera puede realizar la programación.

Si sigues esta filosofía, para la mayoría de las personas que conozco, C ++ siempre será "C con clases".

Saludos,

Diego Sevilla
fuente
La mayor parte de eso es muy común en informática y, en general, no creo que sea algo malo. (No se centra en el lenguaje, es decir. Los idiomas que se enseñan obviamente deberían enseñarse correctamente).
jalf
+1: "(no se centra en el lenguaje, es decir. Los idiomas que se enseñan aRE obviamente deberían enseñarse correctamente)"
Jared Updike
6

En mi experiencia, depende en gran medida de la edad del producto / proyecto de software. La mayoría de los proyectos nuevos que conozco utilizan C ++ moderno (RAII, STL, Boost). Sin embargo, hay muchos proyectos de C ++ que tienen más de 10 años, y no se ve C ++ moderno allí.

Además, tenga en cuenta que algunas de las implementaciones de STL más populares estuvieron prácticamente rotas hasta hace unos 5 años (MSVC <7.0 y GNU <3.00)

Nemanja Trifunovic
fuente
4

Creo que la barrera más grande que he encontrado es el soporte de la cadena de herramientas, especialmente en proyectos multiplataforma. Hasta hace unos años, era común ver notas de compilación que decían "la plataforma x necesita que STLport funcione porque su compilador está descifrado". Incluso ahora, veo problemas con las personas que intentan usar múltiples dependencias de terceros vinculadas a diferentes versiones de BOOST. Esto hace que la vinculación sea imposible, lo que significa que tienes que volver atrás y reconstruir tus departamentos desde cero.

Ahora que casi todos han dejado de usar MSVC ++ 6, el desastre de STLport ha quedado atrás. Pero tan pronto como TR1 salga por la puerta, volveremos a "qué versiones de qué entornos lo admiten y lo hacen bien" y una vez más, esto retrasará la adopción.

Trabajo en un proyecto que comenzó en C (no C ++) en 1992. Implementar prácticas modernas en la base de código heredada sería imposible. Asimismo, trabajo en otro proyecto que está mucho más cerca de la vanguardia del lenguaje C ++.

Xenón de Ártico
fuente
3

Muchos equipos en los que he estado y que he escuchado consideran el gran "¿estamos usando excepciones?" pregunta. Este es el código para "¿estamos usando C ++ moderno?"

Una vez que no esté utilizando excepciones, no podrá utilizar todo el poder del lenguaje y sus bibliotecas.

Pero muchas bases de código antiguas no tienen excepciones, y se percibe que es difícil calzar excepciones en una base de código que no las espera, o en un equipo que no sabe cómo usarlas, por lo que la respuesta en tales casos es a menudo 'no'.

En mi experiencia, el C ++ moderno necesita a alguien que le apasione en el equipo, que no pueda soportar la vista de nada menos, para impulsarlo. También necesita superar las objeciones de aquellos que quieren que se parezca más al código heredado.

Si bien no creo que las bases de código antiguas de C ++ desaparezcan muy rápidamente, sí creo que hay más personas apasionadas en el mundo que hace cinco años. Se enfrentan a la misma batalla cuesta arriba que enfrentaron hace cinco años, pero es más probable que encuentren espíritus afines.

Drew Hoskins
fuente
3

Antes de responder a esa pregunta, tendrías que estar de acuerdo en lo que es "Moderno". No es probable que esto suceda, ya que "Moderno" es una palabra mal definida y significa cosas diferentes para diferentes personas. El título del libro de Alexandrescu (Diseño moderno de C ++) tampoco ayuda mucho, ya que es en gran parte un libro sobre Metaprogramación de plantillas, que es un área específica de C ++ pero de ninguna manera es la única.

Para mí, "Modern C ++"! = "Metaprogramming de plantillas". Diría que las características de C ++ sobre C caerían en estas categorías:

  • Clases (constructores, destructores, RAII, fundición dinámica y RTTI)
  • Excepciones
  • Referencias
  • Estructuras de datos y algoritmos en la biblioteca estándar (STL)
  • iostreams
  • Plantillas simples de clase y función
  • Metaprogramación de plantilla

Ninguno de estos es particularmente moderno, ya que todos han estado alrededor de casi 10 años o más. La mayoría de estas características son útiles y le permitirán ser más productivo que la C directa para muchos casos de uso. Un buen programador debería usarlos y los usará en un proyecto de tamaño decente, pero una de estas cosas no es como la otra:

Metaprogramación de plantillas.

La respuesta corta a la metaprogramación de plantilla es simplemente decir no. Desafortunadamente para algunas personas es sinónimo de "programación moderna de C ++", debido al libro, pero al final crea más problemas de los que resuelve. A menos que C ++ desarrolle mejores mecanismos de programación genéricos como la reflexión, no será adecuado para la programación genérica, y los lenguajes de nivel superior como Python serán más adecuados para esos casos de uso. Por esa y muchas otras razones, vea el C ++ FQA

Anton I. Sipos
fuente
66
La metaprogramación de plantillas de IMHO casi nunca es necesaria para la programación de aplicaciones , donde solo sirve para proporcionar niveles de generalidad probablemente innecesarios a costa de la legibilidad y los errores difíciles de entender. Pero OTOH es extremadamente útil para los expertos al crear bibliotecas (a la Boost), donde la generalidad adicional es útil y los mecanismos (feos, difíciles, confusos) pueden ocultarse a la vista.
j_random_hacker
3
Tienes razón en que la metaprogramación de plantillas se puede usar con buen gusto, si se hace con moderación, particularmente en las bibliotecas. Pero con demasiada frecuencia he visto a personas ir demasiado lejos en el camino de la metaprogramación de plantillas, y sus programas sufren como resultado. No estoy en contra de la metaprogramación, de hecho, soy un gran defensor de ello, es solo que las instalaciones de C ++ son bastante crudas.
Anton I. Sipos
2

El mejor libro para aprender C ++. "C ++ acelerado" de Koenig & Moo, enseña lo que usted describe como C ++ moderno, por lo que supongo que la mayoría de las personas lo usan en la actualidad. Para aquellos de nosotros que hemos estado usando C ++ durante bastante tiempo (desde mediados de los años 80 en mi caso), C ++ moderno es un gran alivio de las tediosas tareas de escribir nuestras propias matrices, cadenas, tablas hash (repita hasta la saciedad).

luego
fuente
1
No me refiero a necro, pero acabo de comprar el libro basado en esta recomendación. ¡Tendremos que ver!
Andrew Weir
2

He examinado los trabajos de C ++ y las bibliotecas "modernas" se utilizan cada vez más en las descripciones de los trabajos, MFC, que es una biblioteca de C ++ bastante "antigua", se usa menos.

Rexxar
fuente
1

La estandarización del lenguaje a fines de la década de 1990 fue el primer paso, permitió a los creadores del compilador enfocarse en el conjunto de características "estándar", también permitió que el lenguaje arreglara algunos de los bordes ásperos, que aparecieron a través del proceso de estandarización.

Esto a su vez permitió el desarrollo de marcos basados ​​en características estándar del lenguaje, y no en características proporcionadas por una implementación particular del compilador. La biblioteca Boost es notable en este sentido. Además, esto permitió que el nuevo desarrollo se base en trabajos previos, lo que hace posible soluciones a problemas más complejos.

Un cambio notable aquí es cómo los marcos anteriores se basaban en la noción de clases base y clases derivadas (una característica de tiempo de ejecución). Pero ahora las funciones más avanzadas a menudo se basan en gran medida en plantillas "recursivas" (una función de tiempo de compilación).

El STL tiene sus pros y sus contras, pero sobrevivió a la prueba del tiempo, si quieres algo que funcione y sea simple, el STL seguramente tiene algo para ayudarte a comenzar. No tiene sentido reinventar la rueda (a menos que sea por razones didácticas).

El hardware de la computadora también ha dado grandes saltos desde la década de 1990, luego la memoria y la CPU ya no son una restricción para el compilador. Entonces, la mayoría de las optimizaciones teóricas de los libros ahora son posibles.

Los siguientes pasos del lenguaje son el soporte de la programación multi-core, que es parte del esfuerzo estándar 0x.

Ismael
fuente
1

Si y no. Ciertamente, para nuevos proyectos es cada vez más popular. Sin embargo, todavía hay barreras para la adopción que son prácticas, no políticas, que otros no han mencionado. Hay muchas bibliotecas comerciales de C ++ que usan ABI de compiladores antiguos que no son compatibles con las características que se ven en Modern C ++, y muchas empresas confían en estas bibliotecas. Sun Studio en Solaris, por ejemplo, no puede funcionar con Boost sin el uso de STLport, pero cualquier biblioteca comercial de terceros que desee usar requerirá la versión de Sun de STL. Misma historia con GCC 2.95 y Redhat Enterprise Linux.

Joseph Garvin
fuente
-3

Es sorprendente el poco esfuerzo realizado para hacer que c ++ sea más estable. El sistema de advertencia está en su lugar, pero no está evolucionando mucho. Es aún más fácil pegarse un tiro que hace 10 años. No sé por qué, pero c ++ sigue siendo mi lenguaje favorito. :)

AareP
fuente
Sugeriría leer varios de los libros en este hilo antes de hacer afirmaciones sobre el "pequeño esfuerzo" que se está poniendo en la estabilización de C ++ y que "es aún más fácil dispararse en un pie que hace 10 años".
Patrick Niedzielski
Claro, la biblioteca estándar proporciona cierta estabilidad sobre la asignación de memoria y la manipulación de cadenas. Desafortunadamente internamente usa convenciones de codificación tan extrañas, que pensarías que ha sido escrito por extraterrestres o algo así. :)
AareP
2
Dado que la biblioteca estándar es una especificación, culpe a su proveedor de compiladores por usar extrañas convenciones de codificación interna. Y además, extrañas convenciones de codificación = / = inestable o más fácil de dispararte en el pie. La mayoría de esas convenciones de codificación (hablando al menos sobre la biblioteca MSVC, y probablemente también sobre otras) están diseñadas para no interferir en absoluto con usted, por lo que puede hacer cosas estúpidas y la biblioteca no necesita preocuparse. Si codifica fuera de la especificación C ++, eso es algo diferente.
Patrick Niedzielski
Tenga en cuenta que una implementación típica de STL (especialmente si se incluye con un compilador específico) no tiene que usar Standard C ++ para implementarse. Muy bien puede hacer uso del conocimiento específico de la implementación dentro de sí mismo, para proporcionarle a su código las garantías prometidas por el Estándar. Sin embargo, su propio código solo debe ajustarse a lo que garantiza el Estándar. No puede aprender las garantías estándar al examinar una implementación particular de C ++ o STL.
Tanz87
Esta respuesta fue escrita hace una década. En ese momento, era sorprendente cuánto esfuerzo se estaba haciendo para hacer que c ++ fuera más estable. Esa fue una de las razones clave por las que c ++ 0x tardó tanto en ser lanzado como c ++ 11.
David Hammen