¿Por qué hay un std :: move en <algorithm> y <utility>

8

La mayoría de las veces que veo std::movepublicado aquí, hace referencia a la <utility>versión.

El std::moveen<algorithm> realidad hace lo que su nombre sugiere, movimiento , mientras que el std::moveen<utility> proyecta su argumento a una xValue, que es básicamente un paso de preprocesamiento para finalmente mover el xValue en un valor-I. Entonces, ¿no es un poco confuso que ambos sean nombrados movecuando la funcionalidad de cada uno es diferente?

Iamanon
fuente
1
Pregunta posiblemente relacionada: ¿Por qué std :: swap se movió de <algorithm> a <utility>?
Brian
2
Sí, movedebería haber sido llamado make_rvalueo algo por el estilo. Es frustrante explicar una y otra vez que el parámetro único en std::moverealidad no mueve nada.
NathanOliver
El que <algorithm>está dentro es simplemente el que está <utility>aplicado a un rango completo.
Rin Kaenbyou
1
@KaenbyouRin Sí, pero el que <algorithm>realmente realiza el movimiento (suponiendo que hay un operador de asignación de movimiento definido para el tipo que estamos moviendo).
Iamanon
1
Toma caliente: deberían haber hecho std::moveun operador en lugar de una función de biblioteca. Cualquier nombre mejor que std::movehubiera sido más largo, lo que apesta.
Brian

Respuestas:

7

Entonces, ¿no es un poco confuso que ambos sean nombrados movimiento?

Puede ser confuso, especialmente para aquellos que no están acostumbrados a los idiomas que admiten sobrecarga. Es cierto que las pautas de programación generalmente desalientan las sobrecargas con significados separados.

Pero tampoco es muy difícil aprender que hay dos funciones con el mismo nombre, aunque esto es subjetivo. Las diferentes listas de argumentos proporcionan un contexto suficiente para reconocer fácilmente una de la otra.

¿Por qué hay un std :: move en ambos y

Porque los diseñadores del lenguaje optaron por usar el mismo nombre para ambas funciones.

std::moveEs una forma muy concisa de expresar ambas funciones. El de adentro <algorithm>es complementario std::copydel mismo encabezado.

mientras que std :: move in convierte su argumento en un valor x, que es básicamente un paso de preprocesamiento para eventualmente moverse

Describir lo que hace la función no es lo único que puede expresar el nombre de la función. En este caso, el nombre expresa la intención del programador que utilizó la función: el programador tiene la intención de moverse del argumento lvalue, si es posible.

Esto es algo que los programadores pueden necesitar escribir con bastante frecuencia; por lo tanto, se necesita un nombre muy corto.

eerorika
fuente