Die Unterscheidung zwischen std::move
und std::forward
ist gut bekannt, wir verwenden letztere, um die Wertkategorie eines weitergeleiteten Objekts zu erhalten, und erstere, um auf rvalue zu referenzieren, um die Bewegungssemantik zu ermöglichen.Warum nicht immer std :: forward verwenden?
In wirksamen modernen C++ existiert eine Richtlinie, dass die Staaten
Verwendung
std::move
auf rvalue Referenzen,std::forward
auf Universal-Referenzen.
Doch im folgende Szenario (und Szenarien, in denen wir nicht wollen, Wertkategorie ändern),
template <class T>
void f(vector<T>&& a)
{
some_func(std::move(a));
}
wo a
keine Forwarding Referenz ist aber eine einfache rvalue Referenz, wouldn‘ t es genau das gleiche zu tun, das folgende?
template <class T>
void f(vector<T>&& a)
{
some_func(std::forward<decltype(a)>(a));
}
Da dies kann leicht in einem Makro wie dieser, verkapselt werden, wie so
#define FWD(arg) std::forward<decltype(arg)>(arg)
ist es nicht praktisch, immer diese Makrodefinition zu verwenden?
void f(vector<T>&& a)
{
some_func(FWD(a));
}
Sind die beiden Schreibweisen nicht exakt gleichwertig?
Ich habe Probleme beim Anzeigen der Makro-Lösung als bequemer als das Schreiben 'move()' ...aber das erscheint mir als eine meinungsbezogene Frage. Beide machen das gleiche – Barry
aber manchmal ist das Argument eine reguläre Referenz und Sie möchten den Vektor verschieben. weiterleiten mit der Weiterleitung erreicht das nicht –
@Barry Ich wollte eine Bestätigung, dass sie gleichwertig sind, thnx dafür. Ich möchte widersprechen, ob sie auf Meinung basieren, einfach befürworten auf einen Programmierstil nicht Voreingenommenheit, könnte man sehr gute Gründe haben, es zu tun (und in der Lage sein, sie zu erarbeiten) –