Mi sono imbattuto in qualche problema di eccezione che non mi è chiaro. In C++, quando un oggetto viene lanciato, viene dapprima copiato su un oggetto temporaneo e l'oggetto temporaneo viene quindi passato al codice catching. La copia implica l'uso del costruttore di copia di classe dell'oggetto. AFAIK, questo significa che se una classe ha un costruttore di copie privato, non può essere utilizzata come eccezione. Tuttavia, in VS2010, il seguente codice viene compilato ed eseguito:Possono essere lanciati oggetti con costruttori di copia privati?
class Except
{
Except(const Except& other) { i = 2; }
public:
int i;
Except() : i(1) {}
};
int main()
{
try
{
Except ex1;
throw ex1; // private copy constructor is invoked
}
catch (Except& ex2)
{
assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
}
return 0;
}
È legale?
Prova ad aggiungere stampe o debug e vedi l'ordine delle chiamate, forse le cose non vengono eseguite esattamente come pensi che facciano. – selalerer
Ho lo stesso comportamento con VS2010 ma non riesce [qui] (http://ideone.com/RlOjl) con gcc v4.3.4. – hmjd
Potrebbe essere che l'oggetto temporaneo è ciò che viene costruito e la copia viene ottimizzata. Simile all'ottimizzazione del valore di ritorno. –