[C++11]RValues e std::move()

di il
6 risposte

[C++11]RValues e std::move()

Buongiorno a tutti,

sto studiando la libreria standard del C++11 almeno le cose basilari.
Mi sono imbattuto nella definizione di queste Rvalues che se non ho capito male servono ad evitare le copie temporanee dei vari oggetti.
Il problema è che ho incontrato questo pezzo di codice:

X x;
coll.insert(std::move(x));
dove si suppone che coll sia stato dichiarato precedentemente come una collezione del tipo corretto.

Quello che non ho capito e che non riesco ad afferrare è se è possibile utilizzare x dopo aver fatto un operazione del genere e se si può perché questo è possibile (a rigor di logica non dovrebbe essere fattibile) .

Esempio

X x;
coll.insert(std::move(x));

std::cout << x << std::endl;
Qualcuno riesce ad aiutarmi a capire?

6 Risposte

  • Re: [C++11]RValues e std::move()

    Lo standard C++ prevede che dopo un'operazione di move, l'oggetto spostato sia comunque in uno stato valido ma indeterminato. Ciò significa che sebbene sia possibile utilizzare un oggetto dopo l'operazione di move, l'oggetto non darà i risultati che dava prima della move() (eventuali puntatori interni saranno posti a nullptr, i dati tipo int, char etc. saranno posti a un valore di default etc.). In pratica si ottiene un oggetto "fantasma".

    Questo non si applica ai tipi fondamentali (int, char etc.), ma solo a oggetti.
  • Re: [C++11]RValues e std::move()

    Ok, ma a questo punto non capisco più l'utilità della move... in che situazione questa potrebbe essere utile se poi mi lascia un oggetto allocato in memoria che mi ritorna dati indefiniti?
  • Re: [C++11]RValues e std::move()

    Perché allocato in memoria? L'oggetto è allocato sullo stack e come tale segue le regole di visibilità come le altre variabili.
    La move() serve solo a invocare il costruttore di spostamento (move constructor) ove previsto dalla classe in esame. Se tale costruttore non è presente allora è invocato il costruttore di copia (se presente), e poiché copiare è più lento che spostare ecco che spostare il contenuto da un oggetto all'altro è più conveniente che copiarlo (almeno se la classe in esame contiene puntatori o strutture dati come vector, map, set, list etc.).
    Il fatto che l'oggetto spostato sia ancora "usabile" è un side effect dovuto al fatto che l'oggetto è creato sullo stack, ma il volerlo "usare" dopo lo spostamento è una forzatura.
  • Re: [C++11]RValues e std::move()

    Capisco, scusate se sono un po' ignorante in materia ma sto ancora studiando cosa sono e come si usano i costruttori di copia e di spostamento ed anche come si gestiscono. Per questo chiedo chiarimenti.

    Grazie delle risposte comunque, io sto studiando da questo libro:

    se aveste da consigliarmi altri articoli o testi utili per capire in modo approfondito questi concetti del C++11 ne sarei molto contento.
    Intanto grazie ancora.
  • Re: [C++11]RValues e std::move()

    Mi pare che quel libro copra gli aspetti che cerchi, comunque ecco un link in perenne aggiornamento che copre aspetti anche del C++14.
    http://www.icce.rug.nl/documents/cplusplus
    Alla sezione 9.5 parla dei costruttori di copia e alla sezione 9.7 dello spostamento dei dati.
  • Re: [C++11]RValues e std::move()

    Grazie mille quel link mi sarà davvero utilissimo!
Devi accedere o registrarti per scrivere nel forum
6 risposte