C++ es un lenguaje con una larga trayectoria de uso en la industria del software. Difícilmente se puede encontrar un programador que no conozca C++. Creado en 1979, C++ fue oficialmente estandarizado en 1998.
Esa estandarización ha sido actualizada en 2003, 2011 y 2014 y hay nuevas revisiones planificadas para 2017 y 2020. Lo que a priori podría parecer un ciclo de vida activo, es considerablemente lento para ser los tiempos que corren. No obstante C++ ha adoptado una filosofía de “evolucionar o morir” en los últimos años. C++14 es un buen reflejo de esa filosofía, aportando un nutrido conjunto de nuevas funcionalidades que enriquecen substancialmente el lenguaje con recursos novedoso o nuevas maneras de utilizar los ya existentes.
Principales nuevas funcionalidades
Deducción de tipos de retorno
Ahora podemos utilizar el tipo auto en la cabecera de una función para indicar al compilador que debe deducir el tipo del elemento retornado. El tipo auto introducido en C++11 ahora puede ser utilizado también para el retorno.
auto miFunc(){
auto var = make_tuple(1,2,3,4);
return var;
}
Expresiones lambda
Las expresiones lambda o lambdas, introducidas en C++ 11 para permitir el uso de funciones anónimas o inline, han recibido nuevas funcionalidades en C++14.
Podemos utilizar el tipo auto para los parámetros de una lambda. Esto hace que trabajar con lambdas genéricas sea muy parecido a utilizar templates (el compilador utiliza las reglas para argumentos de templates y no la deducción de tipos propia de auto).
auto lambda = [](auto parametro1, auto parametro2) { return a * b; ];
También podemos utilizar expresiones en la captura de parámetros de las lambdas, ganando flexibilidad en su utilización.
auto ahora = [reloj = system_clock::now()] {return ahora;};
//retorna el momento de la llamada
Literales binarios
Podemos declarar tipos binarios de manera explícita, agilizando substancialmente su utilización.
auto miDecimal = 1234;
auto miBinario = 0b01010101;
Deprecación explícita
Ahora podemos marcar una entidad como obsoleta para que su uso dispare una advertencia del compilador. Tan solo necesitamos utilizar el atributo [ [deprecated] ]. La rápida evolución de C++ hará que posiblemente veamos este mecanismo usado con frecuencia.
[[deprecated]]
void miFuncionVieja(){
//el compilador avisa
}
Separadores de dígitos
auto mil = 1’000;
auto cienMillones = 100’000’000;
Flexibilidad en constexpr
Introducido en C++11, constexpr especifica que el valor de una variable o función puede aparecer en expresiones constantes, limitando su usabilidad a la de una expresión constante. En C++14 se han ampliado las capacidades de las funciones constexpr para dar soporte a:
- Declaraciones, exceptuando tipos static, thread_local o variables sin inicializar.
- Comparadores if y switch.
- Modificaciones a objetos cuyo ciclo de vida empezó en la evaluación de la expresión constante.
- Constructos con bucles, incluyendo bucles for de rango expecífico.
Otras funcionalidades
Existen otras funcionalidades que no explicamos en detalle:
- Utilización de templates para declarar variables.
- Tipos agregados en las listas de inicialización.
- Mutex y mutex lock agregados.
- Literales definidos por el usuario.
- Otras novedades de sintaxis y compilador.
Resumiendo
Podéis leer el estándar de noviembre 2014 completo (el estándar final es de pago), pero en resumen, C++14 es una extensión de C++11 que añade utilidad a las novedades que habían sido introducidas en la anterior revisión. En vez de traer muchos componentes nuevos (como ya hiciera C++11 con las lambdas, smart pointers o las listas de inicialización) se centra en mejorar el uso que le damos a los últimos introducidos.
El futuro
C++17 está a la vuelta de la esquina, y con la lista definitiva de features por aprobar, parece que será una revisión con más novedades que C++11. Veamos qué nuevas capacidades pretende traer a la mesa:
- Nueva especificación técnica el sistema de archivos (<filesystem> basado en boost:filesystem).
- Nueva especificación técnica para algoritmos paralelos.
- Funciones matemáticas especiales.
- Parte de la librería Fundamentals 1.
- Lambdas con contexpr.
- Bucles for de rango con soporte para tipos distintos en su begin y end.
- Capturas de tipo *this para las lambdas.
- Otras novedades menores.
En la comunidad de reddit de C++ podeis encontrar la lista actualizada y la discusión sobre C++17