Categorías de valor. Referencias lvalue y rvalue

Artículos de la serie:

Categorías de valor en C++


Una expresión es una secuencia de operadores y operandos que especifica un cómputo. Su evaluación puede dar lugar a un valor (por ejemplo, 2*5 genera 10) y/o producir efectos secundarios (fmt::print("{}\n",10) imprime 10 en la consola).

En los estándares C++11 y posteriores, toda expresión es clasificada de acuerdo a la siguiente taxonomía:

Expresiones lambda (I)

Última actualización: 30 de agosto de 2020.

Artículos de la serie:

Objectos función (function objects)


Antes de poder entender qué son y cómo funcionan las expresiones lambda, es preciso que comprendamos el concepto de objeto función.

En el lenguaje C++ las clases pueden sobrecargar el operador llamada a función operator() con el fin de dotar a sus objetos del comportamiento propio de las funciones tradicionales. A modo de ejemplo, consideremos la plantilla estándar std::greater<> proporcionada en el fichero de cabecera <functional>, destinada a realizar la comparación de dos valores dados a través del operador "mayor estricto que" operator>. Una posible implementación de esta plantilla en C++20 vendría dada por:

namespace std {      template<typename T>     struct greater {        constexpr auto operator()(T const& x, T const& y) const -> boolreturn x > y; }     }; }

Expresiones lambda (III)

Artículos de la serie:
 

Expresiones lambda: sintaxis y uso combinado con algoritmos


Los estándares del lenguaje C++11 y posteriores proporcionan las denominadas expresiones lambda con el fin de facilitar la creación de objetos función potencialmente capaces de capturar variables de su entorno. Su utilidad fundamental consiste en la definición in situ de acciones específicas a realizar por parte de los algoritmos. Así, por ejemplo, la eliminación de los valores pares en un vector de enteros puede realizarse de dos formas alternativas:

Expresiones lambda (II)

Artículos de la serie:

Objetos función con estado interno


Los objetos función extienden la utilidad de las funciones tradicionales gracias a la posibilidad de poseer estado interno y proporcionar operaciones adicionales.

A modo de ejemplo, consideremos el problema sencillo de calcular la media aritmética de un conjunto finito de valores numéricos almacenados en coma flotante X = {x1, x2, ... , xn}:

 X = (x1 + x2 + ... + xn)/n.