2010-07-02 16 views
11

Duplicar posible:
How are you using C++0x today?para usar o no usar C++ 0x cuenta

Estoy trabajando con un equipo en un bastante nuevo sistema. Estamos hablando de migrar a MSVC 2010 y ya hemos migrado a GCC 4.5. Estos son los únicos compiladores que estamos usando y no tenemos planes de transferir nuestro código a diferentes compiladores en el corto plazo.

Sugerí que después de hacerlo, comencemos a aprovechar algunas de las características de C++ 0x que ya se proporcionaron como auto. Mi compañero de trabajo sugirió no hacerlo, proponiendo esperar "hasta que C++ 0x se convierta en estándar". Tengo que estar en desacuerdo, pero puedo ver el atractivo en la forma en que lo redactó. Sin embargo, no puedo evitar pensar que este contraargumento proviene más del miedo y la inquietud de aprender C++ 0x que de una genuina preocupación por la estandarización.

Dado el nuevo estado del sistema, quiero que aprovechemos la nueva tecnología disponible. Simplemente automático, por ejemplo, facilitaría nuestra vida cotidiana (simplemente escribiendo ciclos basados ​​en iteradores hasta que aparezcan bucles basados ​​en el rango, por ejemplo).

¿Me equivoco al pensar esto? No es que proponga que cambiemos radicalmente nuestra base de código en ciernes, sino que simplemente comencemos a utilizar las funciones de C++ 0x cuando sea conveniente. Sabemos qué compiladores estamos utilizando y no tenemos planes inmediatos de puerto (si alguna vez portamos el código base, para entonces seguramente los compiladores estarán disponibles con las características de C++ 0x también para la plataforma de destino). De lo contrario, me parece como evitar el uso de iostreams en 1997 solo porque el estándar ISO C++ no se publicó aún a pesar de que todos los compiladores ya los proporcionaron de manera portátil.

Si todos están de acuerdo, ¿podrían proporcionarme argumentos que podría utilizar para fortalecer mi posición? Si no, ¿podría obtener un poco más de detalles sobre esta idea "hasta que C++ 0x sea estándar"? Por cierto, ¿alguien sabe cuándo va a ser eso?

+0

¿Te importaría cuantificar lo que quieres decir con "en el corto plazo"? –

+1

@Neil hasta que surjan alternativas para Windows y Linux que son tan buenas que hacen que GCC/MSVC quede obsoleto. – stinky472

Respuesta

10

Tomaría la decisión por función.

Recuerde que el estándar es realmente está casi terminado. Todo lo que queda es votar, corregir errores y más votaciones.

Por lo tanto, una característica simple como auto no va a desaparecer, o cambia su semántica. Entonces, ¿por qué no usarlo?

Las lambdas son lo suficientemente complejas como para cambiar su redacción y la semántica en algunas cajas de esquina se arregla un poco, pero en general, se comportarán de la manera en que lo hacen hoy (aunque VS2010 tiene algunas errores sobre el alcance de las variables capturadas, MS ha declarado que son errores y, como tales, pueden corregirse fuera de una versión principal del producto).

Si quieres ir a lo seguro, aléjate de lambdas. De lo contrario, úselos donde sea conveniente, pero evite los casos súper complicados, o simplemente prepárese para inspeccionar su uso de lambda cuando se finalice el estándar.

La mayoría de las características se pueden clasificar de esta manera, son tan simples y estables que su implementación en GCC/MSVC es exactamente la forma en que funcionarán en el estándar final, o son lo suficientemente complicadas como para que puedan Obtenga algunas correcciones de errores aplicadas, por lo que se pueden usar , pero corre el riesgo de tropezar con algunos bordes irregulares en ciertos casos de borde.

Suena tonto para evitar la característica C++ 0x únicamente porque aún no están formalizados. Evita las características en las que no confías para que estén completas, libres de errores y estables, pero utiliza el resto.

+0

Gracias jalf por el consejo! Lo tomaré y veré si puedo convencer a mis compañeros de trabajo para que utilicen de forma selectiva ciertas características de C++ 0x. Para proporcionar un poco de información, estoy en un equipo que es reacio a usar la biblioteca estándar sobre sus propias colecciones de handrolled. Parte de la razón es que odian la sintaxis del iterador. Lentamente, cada vez más personas los utilizan al darse cuenta de que no hay una buena razón para no hacerlo, pero todavía hay muchas quejas sobre la sintaxis involucrada en, digamos, un ciclo basado en iteraciones. No me importa, ya que defino todo y la redundancia sintáctica ya no me molesta – stinky472

+0

[...] me molesta demasiado (solo la redundancia lógica), pero podría ayudar a que más personas se unan al uso correcto de C++ si acabamos de tener, decir, auto. – stinky472

+0

@ stinky472: No hay ninguna razón para no usar C++ 0x si sabe que tiene un compilador que lo admita. Recuerde que C++ 0x puede ofrecer muchas mejoras de rendimiento y otras cosas que C++ 03 no puede. Es cierto que teóricamente, una característica podría cambiarse. Pero el costo de cambiarlo cuando se actualiza y el estándar está terminado es mucho menor que el costo de no usar referencias rvalue, auto, decltype, plantillas variadic. – Puppy

8

teóricos pero no prácticos desventajas del uso de C++ 0x:

  • hace que sea más difícil de portar a diferentes compiladores.
  • No se adhiere a ninguna norma publicada.

prácticos ventajas del uso de C++ 0x:

  • hace que su vida diaria más fácil, por lo tanto, más productivo.

Es un debate entre lo que es teóricamente correcto y lo que es práctico. Si su equipo tiene la intención de hacer algo con este código, la práctica debe superar el décuple teórico.

+0

Particularmente si está absolutamente seguro (como parece ser) de que no va a portar este código a un sistema cuyo compilador todavía no lo comprende. Puedo simpatizar con el pensamiento "los estándares son buenos" de tu colega (posiblemente un poco * muy * bien: P) pero si no hay consecuencias negativas reales, es solo un obstáculo innecesario. – shambulator

+7

desventaja teórica, pero poco probable, de utilizar C++ 0x: debido a errores en las dos implementaciones que está utilizando, o cambios en el estándar propuesto, su código puede quedar atrapado en versiones específicas de gcc/msvc. Ejemplo: si hubiera hecho esto hace aproximadamente 7 meses y conceptos muy usados. Vea también: Visual Studio 6. – KitsuneYMG

+0

Si las cosas se eliminan del estándar, pero ya están implementadas en los compiladores, probablemente se convertirán en una extensión de compilador opcional en lugar de eliminarse por completo. Entonces, como dices, es una desventaja teórica pero poco probable. – Thomas

3

Tuvimos exactamente el mismo problema, así que nos comprometimos. Tomamos la versión C++ 0x TR1 y luego solo tomamos las partes que sabíamos que queríamos usar. Parece mucho trabajo, pero hasta ahora ha funcionado bien. Estamos utilizando las bibliotecas de expresiones regulares, las tuplas y un par de otras. Una vez que se ratifique el estándar, migraremos al C++ completo 0x. Obviamente, esta no es la mejor solución, pero fue una que nos funcionó.

+0

+1 Gracias a Nathan por un ejemplo al que podemos comparar. Estoy buscando un compromiso similar: simplemente vaya con las funciones de FCD ya disponibles, no las más exóticas que podrían someterse a nuevas revisiones. – stinky472

7

Una cosa de la que no necesita (en su mayoría) preocuparse ahora son las características que se agregan o quitan porque el borrador en borrador alcanzó "Borrador del Comité Final" (FCD) en marzo. En cuanto a características, debe congelarse, el comité de estándares no aceptará más propuestas para C++ 0x.

Lo malo es que todavía es un borrador y aún no está finalizado, el comité de estándares está en la fase de hacer correcciones y ajustes antes de finalizar y publicar el estándar ISO (el lanzamiento previsto será marzo de 2011). Eso podría significar cambios sintácticos o semánticos/de comportamiento menores que podrían hacer que su código no sea compilable o no funcione correctamente una vez que compile con un compilador que sea más compatible con el estándar que el que está usando en el momento en que escribió el código.

Probablemente tengas que esperar algún tiempo para que los compiladores como VC++ 10 se actualicen con las correcciones/ajustes realizados.

+0

¡Gracias, señalando que el FCD es una gran idea! Creo que tal vez eso podría permitirme ganar a algunas personas en este debate si elegimos selectivamente qué características de C++ 0x podemos usar. – stinky472

1

Si tiene la intención de hacer que su sistema sea de código abierto en un futuro no muy lejano, entonces ese es un argumento para no usar demasiadas características de última generación. Un sistema de producción que ejecute Debian o Red Hat no necesariamente tendrá instalado un compilador de última generación.

Dijiste

si alguna vez puerto de la base de código, por entonces seguramente estará disponible con C++ 0x compiladores características, así como para la plataforma de destino

pero que existe un compilador para una plataforma no siempre significa que está instalado/usado/querido, especialmente en los sistemas de producción.

Si, por otro lado, tiene la intención de hacer toda la compilación usted mismo, esto no es un problema.

+0

+1 Gracias Lajnoid y yo no consideramos las distribuciones de Linux. Es posible que deseemos apoyar otras distribuciones que podrían limitarse a versiones anteriores de GCC. Tendré que plantear ese punto como un tema legítimo para su consideración, pero espero que podamos utilizar algunas de las características básicas de C++ 0x pronto en lugar de esperar años antes de que podamos beneficiarnos de ello. – stinky472

Cuestiones relacionadas