2017-04-05 1 views
0

스마트 포인터에 대해 더 많이 읽고 있었고 하나의 unique_ptr을 다른 것으로 복사 할 때 생성자 개념이 삭제되었습니다. 그 개념은 정확히 무엇입니까?unique_ptr에서 생성자가 삭제되었습니다

#include<iostream> 
#include<memory> 

class Person { 
    public: 
    int e; 
    Person(int e) : e(e) { } 
}; 

int main() { 
    std::unique_ptr<Person> p (new Person(5)); 
    // Below line seems to be deleting constructor and thus error in compiling. 
    std::unique_ptr<Person> q = p; 
} 

std :: move semantics는 잘 작동합니다.

+0

알고 싶은 점은 무엇입니까? 'std :: unique_ptr'는 옮길 수는 있지만 복사 할 수 없습니다. 왜냐하면 그것은 * unique *이기 때문입니다. – songyuanyao

+0

Aah. 이 작은 세부 사항을 놓쳤습니다. –

답변

2

고유 한 포인터는 고유해야하므로 복사 할 수 없습니다. 오직 움직일 수 있습니다.

따라서 복사 생성자가 삭제됩니다.

0

일반 복사 의미는 qp 모두 같은 Person 객체에 대한 포인터를 들고됩니다 모두 소멸자는 delete 같은 객체 것이다.

그건 잘못되었습니다. 동일한 할당을 정확히 한 번 삭제해야합니다.

그러나 이동 의미는 복사되는 개체를 수정할 수 있습니다. std::unique_ptr<>의 경우 개체가 "비어 있음"(즉, nullptr으로 지정됨)으로 설정됩니다.

관련 문제