Соблюдайте параметр с помощью rvalue-reference

Я хочу пояснить, что конструктор моего класса A будет владеть переданным параметром Data. Очевидно, что нужно сделать unique_ptr по значению:

class A
{
public:
    A(std::unique_ptr<Data> data) : _data(std::move(data)) { }

    std::unique_ptr<Data> _data;
};

Однако для моего прецедента нет причин, по которым Data должен быть указателем, так как будет достаточно типа значения. Единственный оставшийся вариант, о котором я мог подумать, чтобы действительно понять, что Data будет принадлежать A, является pass by rvalue-reference:

class A
{
public:
    A(Data&& data) : _data(std::move(data)) { }

    Data _data;
};

Является ли это допустимым способом сигнализировать владение или есть ли лучшие варианты для этого, не используя unique_ptr?

Ответ 1

Да, я думаю, что это правильный способ.

В случае unique_ptr он не копируется, поэтому нет никакой опасности, что кто-то случайно сделает копию, когда они не намереваются так передавать как по значению, так и по пропуску-rvalue-reference означает принятие права собственности.

В случае Data, документов с перекрестными ссылками, которые вы берете на себя, и нет опасности, что вызывающий абонент случайно сделал копию, когда они этого не сделали.

Ответ 2

Да, это действительный путь. Вы также можете передать его по значению:

class A {
    A(Data data) : _data(std::move(data)) { }
};
Data data;
A a(std::move(data));