Por que existe um std :: move no <algorithm> e <utility>

8

Na maioria das vezes que vejo std::moveaqui, está fazendo referência à <utility>versão.

O std::movein<algorithm> realmente faz o que o nome sugere, move , enquanto o std::movein<utility> lança seu argumento para um xvalue, que é basicamente apenas uma etapa de pré-processamento para, eventualmente, mover o xvalue para um lvalue. Portanto, não é meio confuso que esses dois sejam nomeados movequando a funcionalidade de cada um é diferente?

Iamanon
fonte
1
Pergunta possivelmente relacionada: Por que o std :: swap foi movido de <algorithm> para <utility>?
Brian
2
Sim, movedeveria ter sido chamado make_rvalueou algo assim. É frustrante explicar repetidamente que o único parâmetro std::movenão move nada.
NathanOliver 18/03
Aquele <algorithm>é simplesmente aquele <utility>aplicado a toda uma gama.
Rin Kaenbyou 18/03
1
@KaenbyouRin Sim, mas o que <algorithm>realmente executa a movimentação (supondo que exista um operador de atribuição de movimentação definido para o tipo que estamos movendo).
Iamanon 18/03
1
Hot take: eles deveriam ter criado std::moveum operador em vez de uma função de biblioteca. Qualquer nome melhor do que std::moveteria sido mais longo, o que é péssimo.
Brian

Respostas:

7

Então, não é meio confuso que os dois sejam nomeados mover?

Pode ser confuso, especialmente aqueles que não estão acostumados a idiomas que suportam sobrecarga. É verdade que as diretrizes de programação geralmente desencorajam sobrecargas com significados separados.

Mas também não é muito difícil aprender que existem duas funções com o mesmo nome, embora isso seja subjetivo. As diferentes listas de argumentos fornecem contexto suficiente para reconhecer facilmente uma da outra.

Por que existe um std :: move em ambos e

Porque os designers da linguagem optaram por usar o mesmo nome para ambas as funções.

std::moveé uma maneira muito concisa de expressar as duas funções. A entrada <algorithm>é complementar std::copydo mesmo cabeçalho.

enquanto o std :: move lança seu argumento para um xvalue, que é basicamente apenas uma etapa de pré-processamento para, eventualmente, mover

Descrever o que a função faz não é a única coisa que o nome da função pode expressar. Nesse caso, o nome expressa a intenção do programador que usou a função: O programador pretende passar do argumento lvalue - se possível.

Isso é algo que os programadores podem precisar escrever com bastante frequência; portanto, é necessário um nome muito curto.

eerorika
fonte