2012-12-08 11 views
10

std::tie restituisce una tupla di riferimenti, in modo da poter effettuare le seguenti operazioni:In che modo eccezionalmente sicura è std :: tie?

int foo, bar, baz; 
std::tie(foo, bar, baz) = std::make_tuple(1, 2, 3); 

Questo è simile a foo, bar, baz = (1, 2, 3) in Python.

Cosa dovrebbe succedere se uno dei compiti viene lanciato, come nell'esempio seguente?

int foo = 1337; 
struct Bar { 
    Bar& operator=(Bar) { throw std::exception{}; } 
} bar; 
try { 
    std::tie(foo, bar) = std::make_tuple(42, Bar{}); 
} catch (std::exception const&) { 
    std::cout << foo << '\n'; 
} 

Stampa 1337 o 42, o non è specificato?

+1

Poiché il layout di 'tuple' non è specificato, immagino che la risposta qui sia anche" non specificata ". –

risposta

5

Lo Standard parla di tuple assegnazione arte §20.4.2.2 [tuple.assign], l'unica menzione d'eccezione è che la cessione non deve buttare a meno che uno degli elementi assegnati ai tiri liberi.

Poiché non viene menzionato l'ordine di assegnazione degli elementi, è quindi non specificato.

+0

Per la maggior parte dei casi direi che la garanzia di eccezione di base viene fornita fintanto che i tipi coinvolti forniscono l'eccezione di base o migliore. Inoltre, ovviamente, si ottiene noh se tutto va bene, è specificato. –

Problemi correlati