45 votes

Utilisation de membres de référence rvalue?

Je me demandais à quoi sert un membre de référence rvalue

 class A {
  // ...
  // Is this one useful?
  Foo &&f;
};
 

At-il des avantages ou des inconvénients par rapport à un membre de référence lvalue? Quelle est sa principale utilité?

29voto

Howard Hinnant Points 59526

J'ai vu un très motivant de cas d'utilisation pour référence rvalue de données des membres, et c'est dans le C++0x projet:

template<class... Types>
tuple<Types&&...>
forward_as_tuple(Types&&... t) noexcept;

Effets: la construction d'un n-uplet de les références aux arguments en t adapté pour le transfert comme arguments à une fonction. Parce que le résultat peut contenir des références à des temporaires variables, un programme doit s'assurer que la valeur de retour de cette fonction ne de ne pas survivre à l'un de ses arguments. (par exemple, le programme devrait généralement ne pas stocker le résultat dans un variable).

Retourne: tuple<Types&&...>(std::forward<Types>(t)...)

Le n-uplet a référence rvalue de données des membres lors de l'rvalues sont utilisés comme arguments pour forward_as_tuple, et sinon a lvalue de données de référence des membres.

J'ai trouvé forward_as_tuple par la suite utile lorsqu'il est nécessaire d'attraper variadic arguments, parfaitement en avant emballées comme un n-uplet, et re-développer plus tard au moment de l'expédition d'un foncteur. J'ai utilisé forward_as_tuple dans ce style lors de la mise en œuvre d'une version améliorée de tuple_cat proposé dans le LWG 1385:

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1385

15voto

FredOverflow Points 88201

Selon Stephan T. Lavavej, rvalue de données de référence, les membres n'ont pas l'usage.

La chose que j'ai vu les programmeurs font quand ils obtenir des références rvalue, c'est que, ils commencent à aller un peu fou, parce qu'ils sont si puissants. Ils commencent en disant: "Oh, je vais devoir référence rvalue de données des membres, je vais devoir référence rvalue variables locales, je vais devoir référence rvalue valeurs de retour!" Et puis ils écrivent du code comme ceci: [...]

3voto

sellibitze Points 13607
class A {
  // ...
  // Is this one useful?
  Foo &&f; 
};

Dans ce cas précis, il n'y a pas de raison d'utiliser une référence rvalue. Il ne veut pas acheter quelque chose que vous ne pouvait pas l'avoir fait avant.

Mais vous souhaiterez peut-être définir les membres de données avec le type paramétré. std::tuple est pour soutenir la lvalue et de référence rvalue membres de données, par exemple. De cette façon, il vous permet de codifier une expression de la valeur de la catégorie qui pourraient vous être utiles pour "le retard dans le transfert parfait". Le projet de norme inclut même un modèle de fonction de la forme

template<class Args...>
tuple<Args&&...> pack_arguments(Args&&...args);

Mais je suis franchement pas sûr de son utilité.

3voto

jalf Points 142628

Je pense juste à haute voix ici, mais cela n'aurait-il pas une utilité dans les foncteurs? Le constructeur est souvent utilisé pour le "currying", liant certains paramètres à l'avance, avant l'appel de la fonction réelle.

Donc, dans ce contexte, le membre de la classe n'est qu'un terrain intermédiaire (ou une fermeture implémentée manuellement) pour l'appel de fonction à venir, et je ne vois aucune raison pour laquelle une référence rvalue ne serait pas significative.

Mais dans les classes non régulières "non foncteurs", je ne vois pas grand-chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X