Должен ли я std ::перемещать общий указатель _в конструкторе перемещения?

Рассмотрим:

#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());

}

В приведенном выше коде есть две версииGizmo::Gizmo(Gizmo&&)--один использует std::moveдля фактического перемещения shared_ptr, а другой просто копирует shared_ptr.

Обе версии, кажется, работают на поверхности. Одно отличие (единственное различие, которое я вижу ), это не-moveверсии счетчик ссылок shared_ptrвременно увеличен, но ненадолго.

Я бы обычно продолжал и moveshared_ptr, но только для того, чтобы быть ясным и последовательным в моем коде. Я пропустил рассмотрение здесь? Должен ли я предпочесть одну версию другой по какой-либо технической причине?

14
задан Fraser 9 June 2012 в 13:16
поделиться