C ++ 0x montre un exemple d'utilisation std::forward
:
template<class T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
Quand est-il toujours avantageux de l'utiliser std::forward
?
En outre, il nécessite de l'utiliser &&
dans la déclaration des paramètres, est-ce valable dans tous les cas? Je pensais que vous deviez passer des temporaires à une fonction si la fonction était déclarée avec &&
, alors peut-on appeler foo avec n'importe quel paramètre?
Enfin, si j'ai un appel de fonction comme celui-ci:
template<int val, typename... Params>
void doSomething(Params... args) {
doSomethingElse<val, Params...>(args...);
}
Dois-je utiliser ceci à la place:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
De plus, si vous utilisez les paramètres deux fois dans la fonction, c'est-à-dire le renvoi vers deux fonctions en même temps, est-il judicieux d'utiliser std::forward
? La std::forward
même chose ne sera-t-elle pas convertie deux fois en temporaire, en déplaçant la mémoire et en la rendant invalide pour une deuxième utilisation? Le code suivant serait-il correct:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Je suis un peu confus std::forward
, et j'utiliserais volontiers quelques éclaircissements.
Args...&& args
?