2012-12-08 15 views
10

std::tie zwraca parę odnośników, dzięki czemu można wykonać następujące czynności:Jak wyjątek bezpieczny jest std :: tie?

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

Jest to podobne do foo, bar, baz = (1, 2, 3) w Pythonie.

Co ma się stać, jeśli jedno z zadań zostanie rzucone, jak w poniższym przykładzie?

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'; 
} 

Czy wydrukuje 1337 lub 42, czy jest to nieokreślone?

+1

Ponieważ układ 'krotki' jest nieokreślony, wyobrażam sobie, że odpowiedź tutaj również jest" nieokreślona ". –

Odpowiedz

5

Standard mówi krotki przypisania techniki §20.4.2.2 [tuple.assign], jedynym wyjątkiem wzmianki jest to, że zadanie nie powinny rzucać chyba że jednym z elementów przeznaczonych do rzutów.

Ponieważ nie ma wzmianki o kolejności, w jakiej elementy są przypisane, jest to nieokreślona.

+0

W większości przypadków twierdzę, że podstawowa gwarancja wyjątku jest dostarczana, o ile uwzględnione typy zapewniają podstawowy wyjątek lub lepszy. Oczywiście, nie dostaniesz nothff iff wszystko nie jest - to jest określone. –

Powiązane problemy