São valores de retorno vai ser passado por referência rvalue em c ++ 0x?
-
19-09-2019 - |
Pergunta
Vamos dizer que eu tenho uma função:
typedef std::vector<int> VecType;
VecType randomVector();
int processing()
{
VecType v = randomVector();
return std::accumulate(v.begin(), v.end(), 0);
}
O C ++ 0x diz especificamente a cópia espúria será evitada a partir do valor de retorno de randomVector? Ou seria uma necessidade compilador para implementar o RVO? Parece-me que o randomVector()
valor deve ser tratado como um rvalue, e, assim, construtor movimento de v deve ser chamado, mas eu não estou completamente certo de que isso é verdade.
Solução
A regra é a seguinte
- Se o compilador pode fazer RVO, então é permitido fazê-lo, e nenhuma cópia e nenhum movimento é feito.
- Caso contrário, o construtor apropriado é tomada.
Como você disse, o temporário é um rvalue, e, portanto, o construtor movimento é selecionado, por causa de uma regra no 13.3.3.2/3
, que diz que uma liga de referência rvalue para um rvalue melhor do que uma referência lvalue. Ao decidir se a usar o movimento ou o construtor de cópia, resolução de sobrecarga mesmos vão preferir o construtor movimento.
A regra de que o compilador tem permissão para executar RVO é escrito em 12.8/15
.
Outras dicas
Todos os valores de retorno são considerados rvalues
por isso, se o compilador não implementar RVO neste caso, deve usar o construtor movimento, em vez do construtor de cópia.