Соблюдайте параметр с помощью 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));