Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2864 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  std::move

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

std::move

n°1877920
Glock 17Pr​o
Posté le 26-04-2009 à 15:39:24  profilanswer
 

Hi,
 

Code :
  1. class Derived
  2.     : public Base
  3. {
  4.     std::vector<int> vec;
  5.     std::string name;
  6.     // ...
  7. public:
  8.     // ...
  9.     // move semantics
  10.     Derived(Derived&& x)              // rvalues bind here
  11.         : Base(std::move(x)),
  12.           vec(std::move(x.vec)),
  13.           name(std::move(x.name)) { }
  14.     Derived& operator=(Derived&& x)   // rvalues bind here
  15.     {
  16.         Base::operator=(std::move(x));
  17.         vec  = std::move(x.vec);
  18.         name = std::move(x.name);
  19.         return *this;
  20.     }
  21.     // ...
  22. };


 
Dans ce genre de code std::move est utilisé dans le constructeur de move par exemple pour initialiser la variable name, ma question est pourquoi?
Le fait que x soit une rvalue n'implique pas que x.name en soit une ?

mood
Publicité
Posté le 26-04-2009 à 15:39:24  profilanswer
 

n°1879431
Glock 17Pr​o
Posté le 29-04-2009 à 17:35:11  profilanswer
 

:bounce:

n°1879482
Joel F
Real men use unique_ptr
Posté le 29-04-2009 à 19:20:30  profilanswer
 

un membre de rvalue ne peut etre qu'une rvalue lui même hein [:dawa]

n°1879489
Glock 17Pr​o
Posté le 29-04-2009 à 19:43:54  profilanswer
 

c'est ce qui me parraissait le plus logique en effet, mais alors pourquoi faire du std::move ici ?

n°1879495
Joel F
Real men use unique_ptr
Posté le 29-04-2009 à 20:05:50  profilanswer
 

bah car tu peut guère faire autrechose sur une rvalue :o

n°1879498
Glock 17Pr​o
Posté le 29-04-2009 à 20:21:27  profilanswer
 

mais le move à la base ça sert à rendre une lvalue rvalue, donc si c déjà une rvalue pourquoi mover??

n°1879499
Joel F
Real men use unique_ptr
Posté le 29-04-2009 à 20:41:02  profilanswer
 

move preserve la rvalueness d'une rvalue. Qui te dit qu'un de membres là n'a pas lui même un constructeur par move. Si tu passais x.name par lvlaue, il en tomberais pas ou il faut.

n°1879503
Glock 17Pr​o
Posté le 29-04-2009 à 20:48:49  profilanswer
 

sauf que x est forcément une r-value, car on est à cet endroit dans le constructeur de move de x.


Message édité par Glock 17Pro le 29-04-2009 à 20:49:05
n°1879514
Joel F
Real men use unique_ptr
Posté le 29-04-2009 à 21:43:10  profilanswer
 

je parle des move-constructor de base, vec et name ...

n°1879544
Glock 17Pr​o
Posté le 30-04-2009 à 00:20:46  profilanswer
 

oui mais - sauf si on ne se comprend pas- , si on est sûr que x est une r-value, si comme tu me la confirmer "un membre de rvalue ne peut etre qu'une rvalue lui même" et bien je ne vois toujours pas l'intérêt de faire du move par exemple là :  
 
 
 
vec(std::move(x.vec)) : x est r-value=> x.vec est r-value,  so why move ??
 
 
EDIT: à priori l'explication serait que, bien que déclaré comme r-value parameter,  x est traité comme l-value pour des raisons de sécurité, si quelqu'un en sait d'avantage je suis preneur
 
void g(const A& );
void g(A&& );
 
void f(A&& a)
{
 
    g(a);  // calls g(const A& )
}
 
à priori c'est pour éviter des histoires de double move et donc de contenu "voler" deux fois


Message édité par Glock 17Pro le 30-04-2009 à 13:40:58
mood
Publicité
Posté le 30-04-2009 à 00:20:46  profilanswer
 

n°2120952
weblook$$
Posté le 12-01-2012 à 10:57:25  profilanswer
 

car une named rvalue est une lvalue


---------------

n°2121069
Joel F
Real men use unique_ptr
Posté le 12-01-2012 à 19:58:34  profilanswer
 

voial des qu'une rvaleu a un nom, ca devient une lvalue

n°2121380
weblook$$
Posté le 14-01-2012 à 19:36:48  profilanswer
 

de plus il me semble qu'il vaut mieux se contenter dans la pluspart des cas d'un operateur d'assignement par value et qui swap plutot que d'en déclarer un prenant une rvalue reference
 

Code :
  1. struct Test { };
  2. void g(Test && p) { std::cout << "&&"; }
  3. template<class TQ>
  4. void f(TQ&& t)
  5. {
  6. g( std::forward<TQ>(t) );
  7. }
  8. int main()
  9. Test t;
  10. f(t);
  11. std::cin.ignore();
  12. }


Message édité par weblook$$ le 08-05-2012 à 20:31:44

---------------


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  std::move

 

Sujets relatifs
PHP move upload files bizarreerreur Move/Delete sur element ouvert
Faire la traduction de MOVE et LEA en CMove fichiers partir d'une liste
Remoting - File.Delete ou File.Movemove_upload_file()
move_uploaded_file et limite...$_FILES, move_uploaded_file => erreur !
VB 6 .Move[.bat] question sur move :)
Plus de sujets relatifs à : std::move


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR