C++11 rvalues et la sémantique de déplacement de la confusion (return)

J'essaie de comprendre les références rvalue et la sémantique de déplacement de C++11.

Quelle est la différence entre ces exemples, et qui est en passe de ne pas faire le vecteur de la copie?

Premier exemple

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();

Deuxième exemple

std::vector<int>&& return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Troisième exemple

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();
  • Veuillez ne pas retourner les variables locales par référence, jamais. Référence rvalue est toujours une référence.
  • C'est évidemment intentionnel dans le but de comprendre les différences sémantiques entre les exemples lol
  • Vieille question, mais il m'a fallu une seconde pour comprendre votre commentaire. Je pense que la question #2 était de savoir si std::move() créé une persistance de la "copie".
  • std::move(expression) ne crée rien, il rejette simplement l'expression d'une value. Pas d'objets sont copiés ou déplacés dans le processus d'évaluation de std::move(expression).
InformationsquelleAutor Tarantula | 2011-02-13