Почему есть STD :: Move в <algorithm>и <utility> - PullRequest
8 голосов
/ 18 марта 2020

В большинстве случаев я вижу здесь сообщение std::move, ссылающееся на версию <utility>.

std::move в <algorithm> фактически делает то, что предполагает его название, move , тогда как std::move в <utility> Приводит аргумент к xvalue, который в основном является просто этапом предварительной обработки для окончательного перемещения xvalue в lvalue. Так не смущает ли то, что оба они называются move, когда функциональность каждого из них различна?

1 Ответ

7 голосов
/ 19 марта 2020

Так не смешивает ли их имя с именем move?

Это может сбивать с толку, особенно тех, кто не привык к языкам, поддерживающим перегрузку. Это правда, что руководящие указания по программированию обычно препятствуют перегрузкам с разными значениями.

Но также не очень трудно понять, что есть две функции с одинаковым именем, хотя это и субъективно. Различные списки аргументов предоставляют достаточный контекст для легкого распознавания одного из другого.

Почему в обоих случаях есть std :: move и

Поскольку разработчики языка выбрал использование одного и того же имени для обеих функций.

std::move - очень краткий способ express обеих функций. Тот, что в <algorithm>, дополняет std::copy из того же заголовка.

, тогда как std :: move in переводит свой аргумент в значение xvalue, которое в основном является просто шагом предварительной обработки для последующего перемещения

Описание того, что делает функция, не единственное, что может дать название функции express. В этом случае имя выражает намерение программиста, использовавшего функцию: программист намеревается перейти от аргумента lvalue - если это возможно.

Это то, что программистам может понадобиться писать довольно часто; при этом возникает необходимость в очень коротком имени.

...