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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top