È necessario informare il C++ (in particolare std::vector
) che il costruttore e il distruttore di movimento non lanciano, utilizzando noexcept
. Quindi il costruttore di movimento verrà chiamato quando il vettore cresce.
Questo è come dichiarare e implementare un constuctor mossa che viene rispettato da std::vector
:
A(A && rhs) noexcept {
std::cout << "i am the move constr" <<std::endl;
... some code doing the move ...
m_value=std::move(rhs.m_value) ; // etc...
}
Se il costruttore non è noexcept
, std::vector
non può usare, da allora non si può garantire l'eccezione garanzie richieste dallo standard.
Per di più su ciò che è detto nella norma, leggere C++ Move semantics and Exceptions
credito a Bo che lasciato intendere che essa può avere a che fare con le eccezioni. Considerare anche il consiglio di Kerrek SB e utilizzare emplace_back
quando possibile. È può essere più veloce (ma spesso non lo è), può essere più chiaro e più compatto, ma ci sono anche alcuni problemi (soprattutto con costruttori non espliciti).
Modifica, spesso l'impostazione predefinita è ciò che si desidera: spostare tutto ciò che può essere spostato, copiare il resto. Per richiedere esplicitamente che, scrivere
A(A && rhs) = default;
Facendo questo, si otterrà noexcept quando possibile: Is the default Move constructor defined as noexcept?
Si noti che le prime versioni di Visual Studio 2015 e più anziani non hanno sostenuto che, anche se sostiene spostare la semantica .
fonte
2012-01-14 19:50:00
È possibile, utilizzando un'implementazione vettoriale in base al movimento. –
Puoi per favore essere un po 'più specifico su come raggiungere questo obiettivo? –
È sufficiente utilizzare un'implementazione vettoriale in base al movimento. Sembra che la tua implementazione della libreria standard (che è btw?) Non sia sensibile allo spostamento. Potresti provare con contenitori sensibili al movimento di Boost. –