Na maioria das vezes que vejo std::move
aqui, está fazendo referência à <utility>
versão.
O std::move
in<algorithm>
realmente faz o que o nome sugere, move , enquanto o std::move
in<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 move
quando a funcionalidade de cada um é diferente?
c++
move
c++-standard-library
Iamanon
fonte
fonte
move
deveria ter sido chamadomake_rvalue
ou algo assim. É frustrante explicar repetidamente que o único parâmetrostd::move
não move nada.<algorithm>
é simplesmente aquele<utility>
aplicado a toda uma gama.<algorithm>
realmente executa a movimentação (supondo que exista um operador de atribuição de movimentação definido para o tipo que estamos movendo).std::move
um operador em vez de uma função de biblioteca. Qualquer nome melhor do questd::move
teria sido mais longo, o que é péssimo.Respostas:
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.
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>
é complementarstd::copy
do mesmo cabeçalho.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.
fonte