Tal vez estoy haciendo una pregunta tonta, pero miré la página de la wikipedia para RVO here y no pude dejar de preguntarme si ese comportamiento es incorrecto. Lo probé en mi máquina y RVO se pateó completamente a pesar del nivel de optimización. ¿Y si hubiera realmente algo BIG ocurriendo en un constructor? Sé que no debería, pero ¿y si? No puedo entender por qué RVO aún ocurrirá cuando haya efectos secundarios en el constructor.¿No es un error la optimización del valor de retorno (RVO)?
EDITAR: -fno-elide-constructors
parece detener a RVO. Pero la pregunta permanece.
EDIT2: En una nota más seria, ¿cuánta gente sabe algo como esto? Tal vez en el estándar, pero sigue siendo una característica realmente fea como yo lo veo. Al menos los compiladores deberían deshabilitarlo de manera predeterminada y proporcionar un cambio para las personas que lo saben. :)
EDIT 3: Sigo insistiendo en que esto es realmente malo. :). No creo conocer ninguna otra restricción de idioma como esta que vaya directamente en contra de la sintaxis del lenguaje. Todo lo demás arroja errores de compilador o enlazador, ¿verdad?
En lo personal, creo que RVO es una abominación –
¿Puede encontrar un buen caso de uso para tener efectos secundarios no triviales en un constructor de copias? No tengo uno, fuera de uso. Por lo general, se los llama detrás de escena, y es muy fácil cometer un error al calcular cuándo se los llamará. Eso, para mí, es una muy buena razón para dejar de lado los efectos secundarios. –
No tengo ninguna razón para poner efectos secundarios dentro de un constructor de copias. :) – nakiya