2016-09-27 7 views
12

내 클래스 A의 생성자가 전달 된 Data 매개 변수의 소유권을 가져야한다는 것을 분명히하고 싶습니다.rvalue-reference로 매개 변수의 소유권 가져 오기

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

    std::unique_ptr<Data> _data; 
}; 

하지만, 내 사용 사례를 들어, 값 유형이 충분하기 때문에 Data는, 포인터해야 할 이유가 없다 : 할 분명한 것은 값에 의해 unique_ptr을합니다.

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

    Data _data; 
}; 

이이 작업을 수행하려면 거기에 더 나은 옵션을 소유 신호 나있는 유효한 방법입니다 : 내가 생각할 수있는 유일한 나머지 옵션은 DataA가 소유합니다 정말 명확하게 설명하기를 rvalue 참조로 패스입니다 unique_ptr을 사용하지 않고?

+0

왜 소유권을 소유합니까? –

+2

나는 생성자를 명시 적으로 만들 것이다. –

+1

@IvanRubinson 종속성 삽입과 같은 여러 가지 이유로 인해. –

답변

4

예, 유효한 방법이라고 생각합니다.

unique_ptr의 경우 복사 할 수 없으므로 실수로 사본을 만들지 않아도되므로 의도하지 않았 으면 실수로 사본을 만들 위험이 없습니다. 따라서 값별 및 통과 별 참조는 모두 의미가 있습니다. 소유권을 갖는다.

Data의 경우 소유권을 주장하고 우연히 의도하지 않았던 경우 호출자가 우연히 사본을 작성할 위험이 없습니다.

2

예, 유효한 방법입니다. 값으로 전달할 수도 있습니다.

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

물론 이것은 옵션입니다. 그러나 객체를 이동시키지 않아 불필요한 사본을 만들 수 있습니다. –

+2

@angelag이 경우, pass-by-value가 더 나은 옵션이라고 생각합니다. 'Data'가 항상 하나의 소유자를 원한다면, 당신은 그것을 복사 할 수 없도록 만들고,'data_' 값을'unique_ptr'으로했던 것과 같이 작동시켜야합니다. 그렇지 않으면 '데이터'를 복사 할 수 있으므로 값으로 전달하면 클라이언트에게 두 가지 선택 항목이 제공됩니다. 복사하거나 '이동'합니다. 좀 더 유연하고 때로는 클라이언트가'A'의 생성자에 전달한 후에'Data'의 복사본을 보관하기를 원할 수도 있습니다. –

관련 문제