2011-02-11 15 views
7

Aquí está mi dilema: realmente me gusta Lambda y he estado usando mucho Boost.Fusion y Phoenix. Son bastante maduros y juegan muy bien en muchos compiladores.¿Debo usar C++ 11 lambdas ahora?

¿Qué hay del C++ 11 lambdas? Son realmente agradables y mucho más fáciles de usar que alternativas de impulso (¡no más funtores!). Recientes compiladores de ICC y GCC los respaldan. Pero todavía hay muchos sistemas ICC 9.xy GCC 4.1 y siguientes, sin mencionar los compiladores XL y Sun. ¿Los compiladores ofrecen soporte lambda?

Tiendo a pensar que quizás debería esperar para usar las características de C++ 11 para que los sistemas más antiguos rechacen el código. ¿Qué piensas? Espere a que los compiladores más antiguos se desvanezcan o simplemente lo hagan.

+0

@Jagannath - ¿La estandarización * siempre * completa? Estaba el viejo chiste de "C++ 0x está en hexadecimal", pero como he bromeado en represalia antes, si el 0x está en hexadecimal, también lo es el 20 implícito, así que eso les da hasta 8105. Primero dije esa broma Hace bastante tiempo. – Steve314

+0

@Steve: Deberíamos saber el próximo mes después de la reunión del comité en Madrid. –

Respuesta

13

¿Necesita poder compilar su código usando un compilador que no admita C++ 11 lambdas?

Si es así, entonces no puede usarlos (obviamente). De lo contrario, no hay muchas razones para no usarlos.

Ha habido pocos cambios en la especificación de las expresiones lambda en C++ 11, por lo que existe un riesgo bajo al usarlas ahora. Ciertamente habrá errores de compilación ocasionales, pero en su mayor parte son pocos y distantes.

La única característica principal relacionada con lambda de la que soy consciente es que no está soportada por las últimas versiones de compiladores múltiples que admiten expresiones lambda, que se agregó en marzo pasado, lo que permite que las lambdas sin captura se conviertan implícitamente en punteros de función . Visual C++ 2010 e Intel C++ 11.1 no admiten eso (no tengo una versión posterior de Intel C++ con la que probar, lo siento). Sin embargo, Visual C++ 11 admite la conversión implícita.

+0

En principio, sí, pero puede ser de 1 a 2 años a partir de ahora. Además, podría necesitar comprar un compilador XL más nuevo, por ejemplo. Y no sé si IBM va a actualizar algunos de sus compiladores especializados (p. Ej., BlueGene) – Anycorn

+2

@aaa: Entonces necesita equilibrar el riesgo de que tenga que codificar el puerto para trabajar en un compilador anterior mañana contra la recompensa de usar lambda expresiones en tu código hoy. No sé lo suficiente acerca de su situación para saber cómo funcionará. Al final, solo tú puedes tomar esa decisión. –

5

¿Está apuntando a múltiples compiladores? Entonces no. Si sabe exactamente qué compilador (s) está buscando, y manejan la sintaxis de la misma manera, ¡siga adelante y utilice las nuevas funciones!

1

En su propio código, absolutamente, adelante. Es una excelente idea, de hecho.

Para el trabajo, stackoverflow no es el lugar adecuado para preguntar. A menos que sea el responsable de la toma de decisiones en su lugar de trabajo, y su compilador sepa de lo que está hablando. En cuyo caso te animo a que seas increíble.

3

Mi punto de vista es que si estás trabajando en el código de la biblioteca probablemente deberías esperar. Quiero decir, si desea agrupar una biblioteca para distribución de código abierto o para usar en un paquete multiplataforma comercial, entonces difícilmente podrá controlar qué soporte de compilador estará disponible para lambdas y cómo se comportará. Afortunadamente, las expresiones de lambda, por más agradables que sean, se refieren principalmente al azúcar sintáctico. No ofrecen más funcionalidades que los funtores tradicionales, simplemente lo hacen más agradable y más localizado (por supuesto, puedo estar equivocado sobre esto, mi conocimiento de los usos de lambdas es bastante superficial). Pero, por lo general, una biblioteca está destinada a ocultar la fealdad de la implementación. Y si va a necesitar hacer esta biblioteca utilizable en compiladores que no son compatibles con lambdas, tendrá que proporcionar las implementaciones portátiles alternativas de todos modos. Entonces, a menos que haya una ganancia clara en el uso de lambdas en su biblioteca (ya sea en eficiencia (tiempo de compilación o tiempo de ejecución) o en la experiencia del usuario (por ejemplo, si está usando lambdas para hacer que su biblioteca sea más fácil o más clara o intuitiva)), probablemente no vale la pena el esfuerzo.

Sin embargo, para el código del lado del usuario, puede controlar más fácilmente las plataformas de destino y/o compiladores para su software. En ese caso, si todos los compiladores que está anticipando utilizar soportan lambdas ... ¡entonces se vuelven locos!

Ahora, el punto filosófico, los estándares están ahí para que la gente se conforme a ellos.Eso incluye, por supuesto, a las personas que hacen los compiladores, pero también a las personas que los usan. Cuando las personas comienzan a escribir lindas bibliotecas y/o software que requieren soporte para lambda, las personas que quieran usarlas comenzarán a quejarse a los fabricantes de compiladores para agregar el soporte, lo que a su vez motivará a la gente a usar lambdas ... y también lo hace el balón empezar a rodar

Finalmente, al juzgar la cantidad de rumores que está generando este nuevo estándar y la emoción que se ha estado generando mientras esperaba su lanzamiento, creo que los programadores rápidamente harán de este estándar "el estándar", y los compiladores lo harán tiene que hacer lo mismo para mantenerse con vida.

+0

Sí, tienes razón: las expresiones lambda son azúcar totalmente sintáctica. –