Saltar al contenido

Simplificando las comparaciones lexicográficas con C++

Intentemos decodificar este mensaje de error. Primero, enfócate en el personaje del sombrero ^ en el mensaje de error, que apunta a la llamada del accesorio de horas. Este accesorio devuelve un valor de tipo int, ya que usamos números enteros para representar las horas (junto con los minutos y segundos). Este valor de retorno es un temporal de tipo int (que es el significado pragmático de la parte “rvalor de tipo int” en el mensaje de error).

El problema es que std::tie toma como entrada una referencia no-constante, en nuestro caso de tipo int: “int&”. Y es una violación de una regla de C++ el intentar vincular un valor (es decir, un temporal) a una referencia no-constante. Esto se debe a que una temporal puede evaporarse, por lo que en ese caso la referencia non-const apunta a la basura, lo cual es un error.

Simplificando las comparaciones lexicográficas con C++
Simplificando las comparaciones lexicográficas con C++

En nuestro código anterior, cuando usábamos los miembros de datos privados del Tiempo, no había ningún problema, ya que los parámetros de int&eacutención de std::tie estaban vinculados a los miembros de datos no temporales. Así que el compilador de C++ estaba contento con nuestro código.

Entonces, si nuestro operador < sobrecarga no puede acceder a los datos privados de los miembros de las instancias de clase que se van a comparar, ¿estamos condenados a calderilla ifs? Por supuesto que no. Una posible solución en este caso es usar otra función de ayuda disponible en la librería STL: en lugar de std::tie, podemos usar std::make_tuple.

std::make_tuple reenvía sus argumentos de entrada para construir una std::tuple usando valores, no referencias, a los argumentos de entrada. De esta forma, el compilador no se queja cuando llamamos a los accesos públicos que devuelven temporales. De hecho, antes de que los temporales se evaporen, sus valores se usan para construir una std::tupla. A diferencia de las tuplas construidas con std::tie, las tuplas construidas en este caso con make_tuple contienen valores, no referencias, de los componentes de horas, minutos y segundos del Tiempo.