development

이동 한 객체로 무엇을 할 수 있습니까?

big-blog 2020. 6. 26. 07:44
반응형

이동 한 객체로 무엇을 할 수 있습니까?


표준은 객체가 이동 한 후 내가 할 수있는 일을 정확하게 정의합니까? 이동 된 객체로 할 수있는 모든 것은 그것을 파괴하는 것이라고 생각했지만 충분하지 않습니다.

예를 들어 swap표준 라이브러리에 정의 된 함수 템플릿 을 사용하십시오.

template <typename T>
void swap(T& a, T& b)
{
    T c = std::move(a); // line 1
    a = std::move(b);   // line 2: assignment to moved-from object!
    b = std::move(c);   // line 3: assignment to moved-from object!
}

분명히 이동 된 객체에 할당 할 수 있어야합니다. 그렇지 않으면 2 행과 3 행이 실패합니다. 객체에서 이동하여 다른 작업을 수행 할 수 있습니까? 표준에서 이러한 세부 정보를 정확히 어디서 찾을 수 있습니까?

(그런데, 왜 그 것이다 T c = std::move(a);대신에 T c(std::move(a));라인 1?)


이동 된 오브젝트는 지정되지 않았지만 유효한 상태로 존재합니다. 즉, 객체가 더 이상 많은 것을 수행 할 수는 없지만 모든 멤버 함수는 operator=정의 된 상태 (및 정의 된 상태의 모든 멤버 포함)를 포함한 정의 된 동작을 나타내야하며 여전히 파괴가 필요합니다. 표준은 각 UDT에 고유하기 때문에 특정 정의를 제공하지 않지만 표준 유형에 대한 사양을 찾을 수 있습니다. 컨테이너와 같은 컨테이너는 비교적 분명합니다. 컨텐츠를 옮기고 빈 컨테이너는 올바르게 정의 된 유효한 상태입니다. 프리미티브는 이동 한 오브젝트를 수정하지 않습니다.

참고 사항 : T c = std::move(a)이동 생성자 (또는 이동이 제공되지 않은 경우 복사 생성자)가 명시 적 인 경우 함수가 실패 할 것이라고 생각합니다.


17.6.5.15 [lib.types.moved from]

C ++ 표준 라이브러리에 정의 된 유형의 객체는 (12.8)에서 이동할 수 있습니다. 이동 조작은 명시 적으로 지정되거나 내재적으로 생성 될 수 있습니다. 달리 명시되지 않는 한, 이동 된 객체는 유효하지만 지정되지 않은 상태에 놓입니다.

오브젝트가 지정되지 않은 상태 인 경우 전제 조건이없는 오브젝트에 대한 조작을 수행 할 수 있습니다. 수행하려는 전제 조건이있는 조작이있는 경우 오브젝트의 지정되지 않은 상태가 전제 조건을 만족하는지 알 수 없으므로 해당 조작을 직접 수행 할 수 없습니다.

일반적으로 전제 조건이없는 조작의 예 :

  • 파괴
  • 할당
  • 같은 const를 관찰자 get, empty,size

일반적으로 전제 조건이있는 조작의 예 :

  • 역 참조
  • pop_back

이 답변은 이제 비디오 형식으로 나타납니다 : http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s

참고 URL : https://stackoverflow.com/questions/7027523/what-can-i-do-with-a-moved-from-object

반응형