2012-08-03 13 views
6

En C++ uno no puede confiar en que el constructor de copia sea llamado desde una sentencia de retorno debido a una cláusula especial en el estándar que permite a un compilador omitir una llamada al constructor de copia resultante de un declaración de devolución, incluso si el constructor de copia tiene efectos secundarios. Por lo tanto, es un mal estilo escribir un constructor de copia que haga algo más que simplemente copiar la construcción de la instancia.C++ 11 move constructor con efectos secundarios

¿Existen enunciados similares en el estándar C++ 11 que permitan al compilador eliminar una llamada al constructor de movimiento en determinadas circunstancias? En caso afirmativo, ¿cuáles son esas circunstancias?

+0

Gracias. Pregunta respondida en toda su extensión. ¡Aprendí mucho hoy! El primero (por algunos segundos) fue @Xeo. Esa será la respuesta correcta. Todas las respuestas +1 – ritter

Respuesta

9

Copiar-elision aplica lo mismo para mover la construcción, es exactamente la misma cláusula y tanto la elisión de la construcción de copia como la construcción de movimiento se denominan colectivamente "copia-elisión".

§12.8 [class.copy] p31

Cuando se cumplen ciertos criterios, se permite una implementación de omitir la construcción copiar/movimiento de un objeto de clase, incluso si el constructor de copia/movimiento y/o destructor para el objeto tiene efectos secundarios. [...]

3

Cuando se permite la copia elisión, no se realizará ninguna copia, por lo que no se realizará ninguna llamada al constructor de copia de movimiento, incluso si el objeto es movible. Así que copiar elisión triunfa sobre el movimiento, y no se puede estar seguro (al menos no de manera portátil) cuándo se llevará a cabo. Así que este es un escenario en el que los efectos secundarios en la construcción de copias de movimiento serían una mala idea.

1

Elisión se define de forma idéntica tanto para copiar como para mover. El estándar no tiene ninguna redacción específica para mover, porque están definidos de manera idéntica.

Cuestiones relacionadas