2014-03-19 3 views
5

예를 들어, 어떤 유형의 객체가 있습니다. std::vector<int> v;
이제 v이 모든 내부 메모리를 해제하는지 확인하고자합니다.
C++ 11 shrink_to_fit() 메서드를 사용하기 전에 권장되는 보장 방법은 swap()이며 동일한 형식의 std::vector<>이 비어 있어야합니다.임시의 decltype 생성

그러나 개체의 유형을 지정하고 싶지 않습니다. 나는 유형을 지정 decltype을 사용할 수 있습니다, 그래서 이런 식으로 뭔가를 쓰고 싶습니다

std::vector<int> v; 
// use v.... 
v.swap(decltype(v)()); // Create a temporary of same type as v and swap with it. 
        ^^ 

그러나, 위의 코드는 작동하지 않습니다. 빈 ctor (이 경우)와 함께 임시 decltype(v) 형식을 생성 할 수 없습니다.

임시로 생성하기위한 다른 구문이 있습니까? 당신이 할 수

+0

권장되는 방법은'shrink_to_fit'입니다. – chris

+0

@ 크리스 : 아! 참된. 나는이 방법을 잊어 버렸다. 고마워, 나는 다시 편집 할 것이지만 나의 질문은 여전히있다. –

답변

10

문제는 swap이 왼쪽 값 참조를 사용한다는 것입니다. swap에 임시를 전달할 수 없습니다. 물론 C++ (11)의

decltype(v)().swap(v); 

스왑 트릭이 더 이상 필요하지 않도록 shrink_to_fit() 멤버를 소개 : 대신 당신은 당신의 임시 swap 멤버를 호출 할 수 있도록 주위를 전환해야합니다.

+0

때로는 (템플릿으로 정의하기는 꽤 쉽지만, 벌거 벗은'static_cast'로는 할 수 없다) lvalue를 임시로 생성하는'lvalue_cast'가 있어야한다고 생각합니다. 그것은 필요한 모든 속성을 가지고 규칙은 일반적인 실수에 대한 보호 장치 일뿐입니다. –

3

(C++ 11) :

v.clear(); 
v.shrink_to_fit(); 

또는 :

{ 
    decltype(v) tmp; 

    v.swap(tmp); 
} 

vector::swap 참조에 의해 인수를합니다. 임시는 여기에서 사용할 수 없습니다.

5

당신은 const가 아닌 좌변 참조 임시 를 rvalue을 바인딩 할 수 없습니다, 그래서 당신은 swap의 인수로 전달할 수 없습니다. 그러나 임시의 멤버 함수를 호출 할 수 있습니다, 그래서이 작동합니다

v = decltype(v)(); 

또는 shrink_to_fit를 사용

decltype(v)().swap(v); 

를 C++ 11에서는 임시에서 이동 명확 것

v.clear(); 
v.shrink_to_fit(); 

(문제는 이론에 불과 있도록, 당신은 decltype이없는, C++ (11)가없는 경우, 그 참고).

1

decltype(v)()으로 명명되지 않은 임시 작성을위한 유효한 구문입니다.
다른 원인으로는 swap()decltype(v)()에 의해 반환되는 임시 파일과 함께 작동하지 않는다는 오류가있었습니다.