2016-09-27 3 views
12

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

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

    std::unique_ptr<Data> _data; 
}; 

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

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

    Data _data; 
}; 

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

+0

Почему компания взяла на себя ответственность? –

+2

Я бы сделал конструктор явным –

+1

@IvanRubinson По многим причинам, таким как Injection Dependency. –

ответ

4

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

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

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

2

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

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

Конечно, это тоже вариант. Тем не менее, он не обеспечивает принудительное перемещение объекта, и поэтому могут быть сделаны ненужные копии. –

+2

@angelag В этом случае, я думаю, что преходящая ценность может быть лучшим вариантом. Если вы хотите, чтобы 'Data' всегда имел только ОДИН владелец, то вы должны сделать его не скопированным, и передать' Data' по значению работает как то, что вы сделали с 'unique_ptr'. В противном случае, например, «Данные» могут быть скопированы, «pass-by-value» дает клиенту два варианта: скопировать его или «переместить» его. Это более гибко, и иногда клиент может захотеть сохранить копию «Данные» после передачи его в конструктор 'A'. –

Смежные вопросы