Pregunta

Vamos a decir que tengo una función:

typedef std::vector<int> VecType;
VecType randomVector();

int processing()
{
    VecType v = randomVector();
    return std::accumulate(v.begin(), v.end(), 0);
}

¿Tiene C ++ 0x dice específicamente la copia espuria se desvió desde el valor de retorno de randomVector? ¿O sería un compilador que poner en práctica la OVR? Me parece como el randomVector() valor debe ser tratado como un valor de lado derecho, y por lo tanto el constructor movimiento de v debe ser llamado, pero no estoy completamente seguro de que esto es cierto.

¿Fue útil?

Solución

La regla es la siguiente

  • Si el compilador puede hacer RVO, a continuación, se le permite hacerlo, y no se hace ninguna copia y sin movimiento.
  • Si no, se toma el constructor apropiado.

Al igual que usted dice, lo temporal es un valor de lado derecho, y por lo tanto se selecciona el movimiento constructor, debido a una regla de 13.3.3.2/3, que dice que una referencia rvalue se une a un rvalue mejor que una referencia de valor izquierdo. Al decidir si se debe utilizar el movimiento o el constructor de copia, la resolución de sobrecarga se prefieren para ello el constructor movimiento.

La regla que se permite que el compilador para realizar RVO está escrito en 12.8/15.

Otros consejos

Se considera que todos los valores de retorno que se rvalues por lo que si el compilador no implementa RVO en este caso se debe utilizar el constructor movimiento en lugar del constructor de copia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top