La sémantique de déplacement lors de l'envoi de l'objet en fonction du paramètre

Je suis en train de jouer avec des constructeurs de déplacement et de déplacer des affectations et j'ai tombé sur ce problème. Premier code:

#include <iostream>
#include <utility>

class Foo {
    public:
        Foo() {}

        Foo(Foo&& other) {
            value = std::move(other.value);
            other.value = 1; //since it's int!
        }

        int value;

    private:
        Foo(const Foo& other);
};


void Bar(Foo&& x) {
    std::cout << "# " << x.value << std::endl;
}

int main() {
    Foo foo;
    foo.value = 5;

    Bar(std::move(foo));
    std::cout << foo.value << std::endl;

    return 0;
}

À mon esprit, lorsque j'utilise:

Bar(std::move(foo));

Programme doit "bouger" foo objet à la température de l'objet créé à l'aide de constructeur de déplacement en fonction de la Barre. Cela permettrait de laisser foo de l'objet de valeur égale à zéro. Malheureusement, il semble que l'objet tenu dans la Barre de fonction en tant que paramètre est une sorte de référence, depuis il ne marche pas "déplacer" à l'origine de la valeur, mais à l'aide de la Barre de paramètre je peux le changer.

Quelqu'un esprit expalining-moi pourquoi je vois dans la console:

#5
5

au lieu de

#5
0 //this should be done by move constructor?
Voir ici: Les types intégrés ont une sémantique de déplacement?
Il pourrait être l'éducation de comparer ce qui se passe si à la place vous avez void Bar(Foo x);.
Si la fonction est Bar(Foo&& x), puis à l'intérieur de Bar, c'est exactement la même chose comme si la fonction a été Bar(Foo& x). La différence est uniquement dans lequel sortes d'objets/les références peuvent se lier à elle lors de l'appel de la fonction.
oui, je l'ai déjà vu et si vous lisez attentivement, vous savez qu'il n'est pas le... voir la "valeur = std::move(d'autres.valeur); autres.valeur = 1; //car il est int!" code...
merci, c'est ce que je voulais. Je n'ai pas réaliser que && fonctionne comme une référence normale (enfin, pas exactement, mais...) et qu'il doit construire l'objet (ce qui est assez stupide de moi si j'y pense maintenant).

OriginalL'auteur RippeR | 2014-11-26