Ritengo che, mentre per l'operatore = è necessario evitare il "self assignment", non lo è - logicamente - per il costruttore di copia, perché questo viene effettivamente usato per costruire un nuovo oggetto che, in quanto nuovo, *non esiste* in precedenza per poterlo copiare (qui sconfiniamo in filosofia).
Ritengo che sia sensato il comportamento di Visual C++ che indica come inesistente l'oggetto a destra in
oggetto ogg(ogg);