Facendo il lavoro nel respingere il vettore

3

Spesso uso la seguente sintassi:

std::vector<foo> vec;
vec.push_back( someClass.getFoo(...).modifyAndReturn() );

Considerato la sicurezza delle eccezioni, cito lo standard sul comportamento di push back del vettore (23.3.7.5):

If an exception is thrown other than by the copy constructor, move constructor, assignment operator, or move assignment operator of T or by any InputIterator operation there are no effects. If an exception is thrown by the move constructor of a non-CopyInsertable T, the effects are unspecified.

  • È una buona pratica utilizzare i push back complicati?
  • C'è qualche eccezione pericoli?
posta Nikos Athanasiou 19.02.2014 - 09:08
fonte

2 risposte

12

Se usare espressioni così complicate in un respingimento (o qualsiasi altra chiamata di funzione) è discutibile e dipende da due fattori: 1. le convenzioni di codifica locali e 2. il livello di comfort di te e del tuo team con la lettura di tali espressioni

Riguardo alla sicurezza delle eccezioni, non vi è alcuna differenza tra questi tre frammenti:

std::vector<foo> vec;
vec.push_back( someClass.getFoo(...).modifyAndReturn(...) );

std::vector<foo> vec;
auto temp = someClass.getFoo(...).modifyAndReturn(...);
vec.push_back( temp );

std::vector<foo> vec;
auto temp = someClass.getFoo(...);
auto temp2 = temp.modifyAndReturn(...);
vec.push_back( temp2 );

L'eccezione di sicurezza di std::vector<>::push_back non entra realmente nell'immagine, perché se getFoo o modifyAndReturn genererebbe un'eccezione, push_back non verrà nemmeno chiamata. In C ++, gli argomenti di una funzione vengono sempre valutati prima che la funzione venga richiamata.

    
risposta data 19.02.2014 - 10:07
fonte
3

Il respingimento non è complicato. Il suo argomento è (un po ').

Se questo è un idioma comune e viene utilizzato in modo coerente attraverso il codice, allora è una buona pratica. Potrei preferire valutare l'argomento in una variabile locale con un nome utile per aiutare i lettori a capire il significato del valore, ma poi, di nuovo, potrei non farlo. Se conoscessi Class e Foo, capirei questo codice.

I pericoli cui si fa riferimento in questo estratto sono relativi alle eccezioni che potrebbero essere generate all'interno del vettore come risultato del richiamo di vari tipi di operazioni di costruzione o copia. Le eccezioni sollevate durante la valutazione dell'argomento sono esterne al vettore e sarebbero uguali se si valutasse l'argomento separatamente. Allo stesso modo, le eccezioni sollevate all'interno del vettore non sarebbero state evitate da una valutazione preliminare degli argomenti. Non vedo nulla da temere.

Vai per questo. Stai andando bene.

    
risposta data 19.02.2014 - 10:05
fonte

Leggi altre domande sui tag