La distinzione tra std::move
e std::forward
è ben nota, usiamo quest'ultima per conservare la categoria di valore di un oggetto inoltrato e la prima per eseguire il cast di riferimento di rvalue per abilitare la semantica del movimento.Perché non usare sempre std :: forward?
In efficace moderna C++, esiste una linea guida che gli Stati
uso
std::move
su riferimenti rvalue,std::forward
su riferimenti universali.
Eppure, nello scenario seguente (e scenari in cui non vogliamo cambiare categoria valore),
template <class T>
void f(vector<T>&& a)
{
some_func(std::move(a));
}
dove a
non è un riferimento di inoltro, ma un semplice riferimento rvalue, wouldn' t essere esattamente lo stesso per fare quanto segue?
template <class T>
void f(vector<T>&& a)
{
some_func(std::forward<decltype(a)>(a));
}
Da questa può essere facilmente incapsulata in una macro come questa,
#define FWD(arg) std::forward<decltype(arg)>(arg)
non è conveniente utilizzare sempre questa macro definizione in questo modo?
void f(vector<T>&& a)
{
some_func(FWD(a));
}
Non sono i due modi di scrivere questo esattamente equivalente?
Ho problemi a visualizzare la soluzione macro più comoda della scrittura di 'move()' ...ma questo mi sembra una domanda basata sull'opinione pubblica. Entrambi fanno la stessa cosa – Barry
ma talvolta l'argomento è un riferimento regolare e tu vuoi spostare il vettore. Continuare a usare l'inoltro non è sufficiente. –
@Barry Volevo una conferma su di loro equivalente, quindi per quello. Mi piacerebbe non essere d'accordo sul fatto che siano basate sull'opinione pubblica, semplicemente difendere uno stile di programmazione non implica pregiudizi, si potrebbero avere ottime ragioni per farlo (ed essere in grado di elaborarli) –