C ++ 0x zeigt ein Beispiel für die Verwendung von std::forward
:
template<class T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
Wann ist es immer vorteilhaft zu verwenden std::forward
?
Außerdem muss es &&
in der Parameterdeklaration verwendet werden. Ist es in allen Fällen gültig? Ich dachte, Sie &&
müssten temporäre Funktionen an eine Funktion übergeben, wenn die Funktion darin deklariert wurde. Kann foo also mit einem beliebigen Parameter aufgerufen werden?
Zum Schluss, wenn ich einen Funktionsaufruf wie diesen habe:
template<int val, typename... Params>
void doSomething(Params... args) {
doSomethingElse<val, Params...>(args...);
}
Soll ich das stattdessen verwenden:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
Wenn Sie die Parameter zweimal in der Funktion verwenden, dh gleichzeitig an zwei Funktionen weiterleiten, ist es sinnvoll, sie zu verwenden std::forward
? std::forward
Konvertieren Sie dasselbe nicht zweimal in ein temporäres Element, verschieben Sie den Speicher und machen Sie ihn für eine zweite Verwendung ungültig? Wäre der folgende Code in Ordnung:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Ich bin ein bisschen verwirrt von std::forward
und würde gerne etwas aufräumen.
Args...&& args
?