Рассмотрим:Должен ли я std :: переместить shared_ptr в конструкторе перемещения?
#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
временно увеличивается, но только ненадолго.
Я бы обычно пошел дальше и shared_ptr
, но только для того, чтобы быть четким и последовательным в моем коде. Я пропустил здесь рассмотрение? Должен ли я предпочесть одну версию над другой для любой технической причины?
Перемещение в конструкторе перемещения, по крайней мере, семантически непротиворечиво ... – ildjarn
Почему вы сохраняете строку в shared_ptr? Share_ptr как переменная-член чаще всего является признаком плохого дизайна. –
Перемещение в конструкторе перемещения соответствует тому, что автоматически генерирует компилятор. –