Transfert d'arguments avec std::forward
En C 0x, std::forward est utilisé pour transférer des arguments vers un autre appel de fonction. Ceci est avantageux lorsque vous souhaitez éviter d'avoir à copier ou déplacer explicitement les arguments.
L'utilisation de std::forward implique l'utilisation de la notation &&& dans les paramètres de la fonction. Cette notation vous permet d'accepter à la fois les références lvalue et rvalue comme arguments.
Dans l'exemple donné :
<code class="cpp">template<class T> void foo(T&&& arg) { bar(std::forward<T>(arg)); }</code>
L'expression std::forward
Cependant, vous ne devez pas utiliser std::forward dans tous les cas. Cela n'est nécessaire que lorsque vous devez conserver le type de référence de l'argument. Par exemple, si vous avez une fonction qui ne prend pas de références rvalue, vous ne devez pas utiliser std::forward.
Dans l'exemple suivant :
<code class="cpp">template<int val, typename... Params> void doSomething(Params... args) { doSomethingElse<val, Params...>(args...); }</code>
Vous n'avez pas besoin d'utiliser std::forward car la fonction doSomethingElse peut prendre des références lvalue ou rvalue.
Cependant, si vous avez une fonction qui prend des références rvalue, vous devez utiliser std::forward pour vous assurer que les arguments sont transmis en tant que rvalue références. Par exemple :
<code class="cpp">template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); }</code>
Dans cet exemple, std::forward est utilisé pour garantir que les arguments sont transmis en tant que références rvalue, même s'il s'agit initialement de références lvalue.
Enfin, vous ne devrait pas transmettre un argument plusieurs fois. Cela peut conduire à un comportement indéfini. Par exemple, le code suivant est incorrect :
<code class="cpp">template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); doSomethingWeird<val, Params...>(std::forward<Params>(args)...); }</code>
Dans cet exemple, les arguments sont transmis deux fois, ce qui peut conduire à un comportement indéfini.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!