2011-01-20 3 views
4

Exceptional C++ 항목 10에서는 임시 사용에 대해 설명합니다 (35 페이지의 맨 위에 "... 즉, 반환 된 임시 사본을 대상에 복사").임시 개체에 대한 쿼리

코드는 I 임시 어디 왜 만들어지는 것에 매우 명확하지 않다

template<class T> 
T Stack::<T>::Pop() 
{ 
... 
T result = ... 
return result; 
} 

... 


string s1(s.Pop()); 

입니다.

함수에서 값으로 개체를 반환하면 항상 임시로 생성됩니까? 왜 그리고 그 범위는 무엇입니까? 이 경우 s1이 아마도 임시로 생성 된 사본입니까? 함수 내에서 결과 객체로 생성 할 수없는 이유는 무엇입니까?

TIA

------- 편집 --------- 나는 책이 용어 사본을 사용하고, 그가의 의미와 그것을 사용하기 때문에 혼란 것 같아 작동하는 동안 나는 그것이 중복을 의미한다고 생각했다. 일반적으로 Verr 좋은 명확한 책, 그러나이 특정한 절은 아마 일 수 있었다처럼 명확하지 않다.

+0

그리고 나는이 예에서 유형 T의 임시 객체가 두 개 이상 생성되었다고해도 될까요? – Kos

답변

2

의 이름이 지정되지 않은 반환 값은 임시입니다. 함수의 반환 값으로 생성 된 다음 string의 복사 생성자로 전달 된 다음 즉시 파괴됩니다.

+0

T 결과가 임시입니까? 나는 그것을 내 머리 속에 넣었다. 임시적인 추가 이름없는 것에 대해 이야기하고 있었다. –

+1

임시 변수는'T Stack '에 의해 반환 된'T'의 이름없는 인스턴스입니다. :: Pop()' –

1

리턴 값은 작성중인 임시 값입니다. 일부 컴파일러는 여분의 복사 생성을 피하는 return value optimization이라는 것을 구현합니다.

또한 T result = ... 행은 원본 텍스트에 복사본을 만듭니다.

+2

'T variable = T_expression'은'T variable (T_expression)'보다 임시 변수를 더 생성하지 않습니다. 임시 표현의 차이는 표현의 유형이 'T'가 아닌 경우에만 작용합니다. – fredoverflow

+0

사실, 연산자 []는 일반적으로 참조를 반환합니다. 즉, 값 유형에 저장할 때 복사본을 만드는 것입니다. – ChrisV