2015-05-16 19 views
6

std::swap è dichiarata in questo modo:eccezioni disabili e noexcept()

template <class T> void swap (T& a, T& b) 
    noexcept (is_nothrow_move_constructible<T>::value && 
       is_nothrow_move_assignable<T>::value); 

Se rendo invalida eccezioni nel mio programma (come con -fno-exceptions per g ++) sarà std::swap operazioni di uso di movimento per i miei tipi personalizzati se sono abilitato per il movimento, indipendentemente dal fatto che siano inaffidabili o no?

EDIT: follow-up domanda:

Dopo aver capito che std :: swap sarà sempre usare le mosse se il mio tipo li ha, la mia vera domanda è che cosa accade a tratti come is_nothrow_move_assignable<>?

std::vector utilizza sempre le mosse durante la riallocazione se i miei tipi hanno operazioni di spostamento noexcept(true)?

+0

Le regole '' move'' del compilatore sono ortogonali alle eccezioni. –

+0

@AmiTavory le regole di spostamento si, ma per quanto riguarda i tratti come '' 'is_nothrow_move_constructible'''? – onqtam

+1

Scrivi un programma di test breve (3 righe) che stampa il risultato di 'is_nothrow_move_constructible' compila con e senza -fneccezioni –

risposta

4

Il noexcept-specifica a swap dice solo l'utente dove lei può usare swap senza incontrare un'eccezione. Il attuazione è praticamente sempre equivalente a

auto tmp = std::move(a); 
a = std::move(b); 
b = std::move(tmp); 

che muove gli oggetti intorno se, e solo se, la risoluzione di sovraccarico seleziona un operatore di assegnazione movimento e/o il costruttore.

2

Sì. noexcept specifica semplicemente che std::swap non verrà lanciato se il costruttore di movimento T e l'assegnazione di spostamento non verranno lanciati. Non influisce sul comportamento del corpo di swap - che utilizzerà il costruttore di movimento T e sposta l'assegnazione indipendentemente dal fatto che vengano lanciati e indipendentemente dal fatto che vengano compilati o meno con le eccezioni attivate.

Problemi correlati