Devrais-je std :: déplacer un shared_ptr dans un constructeur de mouvement?

Considérer:

#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

class Gizmo
{
public:
    Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
    Gizmo(Gizmo&& rhs); //Implemented Below

private:
    shared_ptr<string> foo_;
};

/*
//doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
:   foo_(rhs.foo_)
{
}
*/


//Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
:   foo_(std::move(rhs.foo_))
{
}

int main()
{
    typedef vector<Gizmo> Gizmos;
    Gizmos gizmos;
    generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
    {
        Gizmo ret;
        return ret;
    });

    random_shuffle(gizmos.begin(), gizmos.end());

}

Dans le code ci-dessus, il existe deux versions de Gizmo::Gizmo(Gizmo&&) -- on utilise std::move à fait déplacer la shared_ptret l'autre juste des copies de la shared_ptr.

Les deux semblent fonctionner sur la surface. Une différence (la seule différence que je peux voir) est dans la non-move version le nombre de références de la shared_ptr est temporairement augmenté, mais seulement brièvement.

Je devrais normalement aller de l'avant et move la shared_ptrmais seulement à être clair et cohérent dans mon code. Ai-je raté une considération ici? Dois-je préférer une version par rapport à l'autre pour tout technique raison?

source d'informationauteur John Dibling