consideri il frammento:gettando un rvalue
try {
Foo f;
throw std::move(f);
}
catch (Foo& f) { }
[expr.throw] dice che:
il tipo dell'oggetto eccezione è determinata da rimuovere qualsiasi livello superiore CV-qualificazioni dal tipo statico dell'operando e la regolazione del tipo da "matrice di T" o "funzione di ritorno T" a "puntatore a T" o "puntatore a funzione di ritorno T", rispettivamente.
che sarebbe Foo&&
. L'oggetto eccezione viene inizializzata secondo [except.throw]:
un'eccezione copia-inizializza (8.5, 12.8) un oggetto temporaneo, definito oggetto eccezione. Il temporaneo è un lvalue e viene utilizzato per inizializzare la variabile dichiarata nel gestore corrispondente (15,3). Se il tipo dell'oggetto eccezione è un tipo incompleto o un puntatore a un tipo incompleto diverso da (possibilmente qualificato cv)
void
il programma è mal formato.
Questo mi fa pensare che l'oggetto eccezione viene inizializzato come:
Foo&& __exception_object = std::move(f);
e che il gestore non sarebbe partita. Tuttavia, sia gcc che clang catturano questa eccezione. Quindi qual è il tipo effettivo dell'oggetto eccezione qui? Se Foo
, perché?
Perché il downvote? – Barry