programing tip

이동 된 컨테이너를 재사용 하시겠습니까?

itbloger 2020. 10. 15. 07:34
반응형

이동 된 컨테이너를 재사용 하시겠습니까?


이동 된 컨테이너를 재사용하는 올바른 방법은 무엇입니까?

std::vector<int> container;
container.push_back(1);
auto container2 = std::move(container);

// ver1: Do nothing
//container2.clear(); // ver2: "Reset"
container = std::vector<int>() // ver3: Reinitialize

container.push_back(2);
assert(container.size() == 1 && container.front() == 2);

내가 C ++ 0x 표준 초안에서 읽은 것에서; ver3은 올바른 방법 인 것 같습니다. 이동 후 개체가

"달리 명시되지 않는 한, 이러한 이동 된 개체는 유효하지만 지정되지 않은 상태로 배치됩니다."

"다른 방법으로 지정"된 인스턴스를 찾지 못했습니다.

비록 ver3가 약간 원형이고 ver1을 선호하지만 vec3는 추가 최적화를 허용 할 수 있지만 다른 한편으로는 쉽게 실수로 이어질 수 있습니다.

내 가정이 맞습니까?


"유효하지만 지정되지 않은 상태"사양의 섹션 17.3.26에서 :

객체의 불변성이 충족되고 객체에 대한 작업이 해당 유형에 대해 지정된대로 동작하는 것을 제외하고 지정되지 않은 객체 상태 [예 : x유형 의 객체 std::vector<int>유효하지만 지정되지 않은 상태 인 x.empty()경우 무조건 x.front()호출 될 수 있으며 호출 될 수 있음 x.empty()false를 반환 하는 경우에만 . -예제 종료]

따라서 개체는 라이브입니다. 사전 조건이 필요하지 않은 모든 작업을 수행 할 수 있습니다 (먼저 사전 조건을 확인하지 않는 한).

clear예를 들어에는 전제 조건이 없습니다. 그리고 객체를 알려진 상태로 되돌립니다. 그래서 그것을 지우고 정상적으로 사용하십시오.


객체가 유효하지만 정의되지 않은 상태 라는 것은 기본적으로 객체의 정확한 상태가 보장되지는 않지만 유효하며 이러한 멤버 함수 (또는 멤버가 아닌 함수)가 의존하지 않는 한 작동하도록 보장됨을 의미합니다. 특정 상태를 가진 개체에.

clear()멤버 함수이므로 개체에서 이동 - 호출 할 수있다 (이것은 물론 유효 이외) 객체의 상태에 아무런 전제 조건이 없다. 다른 한편으로, 예를 들어 front()컨테이너가 비어 있지 않은지에 따라 다르므로 비어 있지 않다고 보장되지 않으므로 호출 할 수 없습니다.

따라서 ver2와 ver3 모두 괜찮습니다.


나는 당신이 이동 된 객체로 아무것도 할 수 없다고 생각합니다 (파괴 제외).

당신은 사용할 수 없습니다 swap이동의 모든 장점을 얻을 대신하지만 알려진 상태에서 컨테이너를 떠나?

참고 URL : https://stackoverflow.com/questions/9168823/reusing-a-moved-container

반응형