Con el interés de aclarar: Las respuestas de valor por paso no son incorrectas. Pero tampoco es su primera suposición de la adición de una sobrecarga de string&&
, salvo por un detalle:
Añadir:
X (std::string&& s) : S(std::move(s)) { }
es decir, usted todavía necesita la move
porque aunque s
tiene un tipo declarado de referencia rvalue a string
, la expresión s
utilizado para inicializar S
es una expresión de tipo lvalue string
.
De hecho, la solución que primero propuso (con el movimiento agregado) es ligeramente más rápida que la solución de valor por paso. Pero ambos son correctos. La solución de paso por valor llama al constructor de movimiento de cadena un tiempo adicional al pasar argumentos lvalue y xvalue al constructor de X. En el caso de argumentos lvalue, una copia se hace de todos modos son aproximadamente la misma velocidad).
En el caso de los argumentos xvalue (un valor x es un lvalue que se ha pasado a std::move
), la solución de paso por valor requiere dos construcciones de movimiento en lugar de una. Por lo tanto, es dos veces más caro que la solución de referencia pass by rvalue. Pero aún así muy rápido.
El objetivo de esta publicación es dejar en claro: pasar por valor es una solución aceptable. Pero no es la única solución aceptable. La sobrecarga con pass-by-rvalue-ref es más rápida, pero tiene la desventaja de que el número de sobrecargas requiere escalas como 2^N a medida que aumenta el número de argumentos N.
[Pertinente] (http://stackoverflow.com/questions/7592630/is-pass-by-value-a-reasonable-default-in-c11). –
El código entre comillas es un patrón discontinuo que abarca lo peor de ambos mundos: limita a la persona que realiza la llamada a pasar un valor r a 'X()', pero luego no reenvía la validez al constructor para 'S', que por lo tanto no puede moverse y debe copiar. Por lo tanto, impone una carga a los usuarios de la función, al tiempo que les impide obtener ningún beneficio compensatorio a cambio. –
@underscore_d Creo que cinco años después llegamos a un acuerdo en las respuestas de que mi código no era perfecto;) –