Maison  >  Article  >  développement back-end  >  ## Quand dois-je utiliser std::forward en C ?

## Quand dois-je utiliser std::forward en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 18:25:02751parcourir

## When Should I Use std::forward in C  ?

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(arg) garantit que l'argument est transmis à la fonction bar en tant que référence lvalue ou rvalue, selon le type d'argument.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn