Const правильность, стандартный ход и умные указатели - PullRequest
2 голосов
/ 25 июня 2019

Я изо всех сил пытаюсь понять, когда мне следует использовать умные указатели const и когда их перемещать.

На основании следующего кода:

class Foo;
class Bar;

typedef std::shared_ptr<Foo> FooPtr;
typedef std::shared_ptr<Bar> BarPtr;

class Bar {

};

class Foo {
public:
    static FooPtr create()
    {
        FooPtr f = std::make_shared<Foo>();
        f->initialize();
        return f;
    }

    void setData(const BarPtr& b) {
        m_b = b;
    }
private:
    BarPtr m_b;
};

inline const FooPtr& internalCreateFoo(const BarPtr& b)
{
    FooPtr foo = Foo::create();
    foo->setData(b);

    int id = foo->getID();
    m_foos[id] = std::move(foo);

    return m_foos[id];
}

1: std::move(foo) здесь действительно нужно?

2: что происходит с std::move, если foo создается как const, как const FooPtr& foo = ...?

1 Ответ

3 голосов
/ 25 июня 2019

действительно ли здесь std::move(foo) действительно необходимо?

Необходимо, нет, полезно, да.Без std::move foo это lvalue, поэтому оно приведет к копированию.Это может быть неэффективно.Поскольку вам больше не нужен foo, имеет смысл переместить его в массив, а не копировать его.

что происходит с std::move, если foo создается какconst, как const FooPtr& foo = ...?

Тогда вы получите копию.Вы не можете переместить что-то, что является const, так как перемещение изменяет состояние 1 перемещенного объекта.

1: Теоретически для перемещения может не потребоваться изменение состояния перемещенного объекта, но в любом случае вы просто делаете копию.

...