Supongamos que tengo una clase donde el constructor de copia es privada y no implementado (para que el objeto no copiable)¿Se permite RVO cuando un constructor de copia es privado y no está implementado?
class NonCopyable {
// whatever
private:
NonCopyable(const NonCopyable&);
void operator=(const NonCopyable&);
};
Ahora en alguna función miembro de la misma clase que escribir código que devuelve un objeto de esa clase:.
NonCopyable NonCopyable::Something()
{
return NonCopyable();
}
que es un caso cuando RVO podría poner en
RVO todavía requiere que un constructor de copia es accesible. Dado que la posible llamada al constructor de copia se realiza desde la misma función de miembro de clase, se puede acceder al constructor de copia . Entonces técnicamente RVO es posible a pesar del hecho de que la intención era prohibir el uso del constructor de copia.
¿Se permite RVO en tales casos?
O simplemente usando las funciones C++ 11 'delete' para eliminar claramente la ambigüedad en la etapa de compilación (en lugar de la etapa de enlace) de que la clase no se copiará. –
@ Matthieu: sí, es un mecanismo mejor si no tienes que preocuparte por los compiladores heredados (supongo que ya podemos llamarlos legacy, incluso si estoy seguro de que todavía tienen un gran dominio en el uso). –