Può una pila di avere un metodo sicuro un'eccezione per la restituzione e la rimozione dell'elemento superiore con la semantica di movimento?

StackOverflow https://stackoverflow.com/questions/2620357

Domanda

In una risposta ad una domanda circa std::stack::pop() I rivendicato che la ragione pop non restituisce il valore è per ragioni di sicurezza eccezione (cosa succede se il costruttore di copia getta).

@Konrad ha commentato che ora con la semantica spostare questo non è più rilevante. È vero?

Per quanto ne so, spostare i costruttori possono throw , ma forse con noexcept può ancora essere raggiunto.

Per i punti bonus Quali garanzie può questa operazione di alimentazione filo di sicurezza?

È stato utile?

Soluzione

Naturalmente, non ogni tipo è mossa-enabled e C ++ 0x consente anche gettando costruttori mossa. Finché costruire l'oggetto da un rvalue può generare non può essere sicuro rispetto alle eccezioni. Tuttavia, la semantica mossa ti permette di avere molti tipi che sono nothrow-costruibile dato una fonte rvalue.

supporto condizionale per questo potrebbe essere fatto con SFINAE. Ma anche senza tale condizionale funzione membro nulla vi impedisce di scrivere:

auto stack = ...;
auto elem = std::move_if_noexcept(stack.back());
stack.pop_back();

che è rende la garanzia forte un'eccezione anche nel caso in cui il costruttore mossa non dà la garanzia forte.

Altri suggerimenti

Per quanto riguarda la domanda di bonus, che avrebbe offerto nessun thread-sicurezza. Si consideri che, per esempio, la maggior parte delle implementazioni di std::vector hanno tre elementi di dati (puntatore di inizio di memoria, puntatore un oltre la fine dei dati utilizzati, puntatore uno oltre la fine di memoria allocata). Spostare la semantica consentono di mossa il contenuto del vettore, senza la necessità di riallocare e valori copiare, ma che non ha nulla a che fare con la sicurezza thread. Si dovrà usare costrutti thread-safe per rendere il thread-safe struttura (come in movimento non implica con qualsiasi mezzo atomica )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top