2016-07-16 3 views
4

La façon dont je pense à quelque chose comme X&& x = static_cast<X&&>(obj_x); est que, malgré les apparences, x finit par être une référence lvalue ordinaire. J'ai récemment rencontré this article où Scott Meyers insiste sur le fait que x serait une lvalue de référence de type rvalue. Est-ce vraiment significatif ou est-ce une distinction sans différence? Plus précisément, étant donné soitEn C++, est-il significatif de dire qu'une variable a une référence de type rvalue?

X&& x = static_cast<X&&>(obj_x) 

ou

X& x = obj_x; 

est-il un code suivant qui se comportera différemment pour ces deux définitions de x?

+1

'decltype (x)'. Si 'x' est un membre de données non statique, cela affecte également la génération du constructeur de copie. – cpplearner

+0

Pourquoi ne pas transformer ce commentaire en une réponse? – Ari

Répondre

1

La distinction importante est de savoir si la référence de valeur R est nommée ou non nommée (valeur de retour).

Donc, pour répondre à la question écrite, non, non code qui suit traiterait les deux définitions de x différemment (sauf, comme cpplearner mentionne, decltype()). Seule la définition de x importerait dans ce que la référence peut se lier à (le terme de fantaisie qui aidera les recherches sur le Web). Tout ce qui a un nom peut être référencé à nouveau, ainsi il est traité comme une valeur l pour se lier aux références suivantes. Pourquoi? Parce que la raison principale pour les références de valeur r est de permettre que quelque chose soit déplacé de. Après que vous en soyez sorti, ce n'est plus viable. Tout ce que vous pouvez faire est de le détruire ou de l'assigner par-dessus. Pas grave si la chose n'a pas de nom, mais si elle a un nom, il est facile de l'utiliser à nouveau accidentellement. C'est pourquoi vous devez appeler std :: move (mything) pour sortir de mon truc [sauf dans certains cas de retour].

Je pense que c'est un article de Herb Sutter qui m'a fait obtenir ce détail, malheureusement je ne le trouve pas maintenant. Si je me trompe, c'est peut-être Stephan T Lavavej.