unique_ptr은 이동 후 nullptr을 저장하도록 보장됩니까?


78

이사 후 unique_ptr보관 이 보장 nullptr되나요?

std::unique_ptr<int> p1{new int{23}};
std::unique_ptr<int> p2{std::move(p1)};
assert(!p1); // is this always true?

2
기술적::move 으로 요소 를 떠나는 상태 는 지정되지 않습니다. 나는 스마트 포인터의 끝에서도 보장이 없다고 생각합니다. 그게 내가 :) 대답에 CPP 전문가로 떠날거야 말했다
벤자민 Gruenbaum

1
잠깐만 요, 괜찮아요 Release는 명시 적으로 nullptr로 설정합니다. 이 보장은unique_ptr
Benjamin Gruenbaum 2014-06-05

gcc 4.8.1 여기서, p1은 std :: move 이후에 null입니다.
Exceptyon

1
std::unique_ptr::operator:및에 대한 참조를 참조하십시오 std::unique_ptr::release.
rubenvb 2014-06-05

이동 의미론을보세요 ...
Deduplicator

답변:


70

예, nullptr이후 move와 비교할 수 있으며 동등하게 비교할 수 있습니다.

§20.8.1 / 4 [unique.ptr] 부터

또한 u요청시 소유권을 다른 고유 포인터로 전송할 수 있습니다 u2. 그러한 전송이 완료되면, 다음 사후 보류 :
- u2.p이전 전송과 동일한 u.p,
- u.p와 동일nullptr 하고,
...

(멤버 p는 앞에서 설명한 것처럼 — 고유 포인터는 u두 번째 개체에 대한 포인터를 저장하는 개체입니다.p )


release ()를 호출 한 후에는 분명히 사실입니다. 그러나 std :: move는 release ()를 호출하지 않습니다. 그렇다면 컴파일러는 unique_ptr의 불변을 복원하는 방법을 어떻게 알 수 있습니까?
mabraham

1
@mabraham는 p2{std::move(p1)}건설 움직임이다 p2에서 p1. 그것은 내가 위에서 인용 한 텍스트에서 요청 된 소유권 이전입니다 . 이동 생성자 구현은 모든 사후 조건이 충족되었는지 확인합니다.
Praetorian

감사. Rephrasing : 이동 생성자를 사용하면 소유권 이전이 요청되며 p1의 불변을 유지해야합니다. std :: move는 이동 생성자의 사용을 활성화합니다.
mabraham

10

예. C ++ 2011 표준 섹션 20.7.1 / 4에서 :

또한 u는 요청에 따라 소유권을 다른 고유 포인터 u2로 전송할 수 있습니다. 이러한 전송이 완료되면 다음 사후 조건은 [...] [원본 unique_ptr]이 nullptr과 같습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.