2012-02-06 5 views
16

임시에 대한 참조는 "생존"합니까?이 임시 참조는 충분히 오래 살아남습니까? 이 X에 할당 될 때까지</p> <pre><code>template <typename T> T const & foo(T const & dflt) { return /* ... */ ? /* ... */ : dflt; } int x = foo(5); </code></pre> <p>에서

(나는 그것이 foo는() 호출의 지속 시간이 남아 알고 있지만, 할당이 나를 주저하게) 문제의 코드 즉, 내가 별도의 두를 필요가 여기에 const를 참조에 의존하는 몇 가지 합법적 인 용도로 사용

을 기능

내가 피하고 싶은
T const & foo_cr(T const & dflt); 
T const & foo_v(T dflt); 

(단지 이름이 같은 사랑의 다른 서명에 의존 나에게 위험 조금 보인다.)

+0

무엇이'...? ... : dflt; 0_o –

+1

이 컨텍스트에서'...'는 "질문과 관련이없는 코드입니다. 주석으로 변경했습니다. 아마도 더 명확합니다." – peterchen

답변

14

임시에 대한 참조를합니까 u는 "생존" x에 할당 된 ntil?

일반적으로 예. foodflt을 반환하면 해당 참조 (임시 5까지)는 초기화 후까지 전체 표현식의 끝까지 유효합니다.

C++ 03, 12.2/3 :

구현이 가 아닌 사소한 생성자 (12.1)가있는 클래스의 임시 개체를 소개

, 그것은 생성자를 호출하도록 보장한다 임시 개체. 비슷하게, 소멸자는 임시가 아닌 소멸자 (12.4)와 함께 호출되어야한다. 임시 개체는 의 마지막 단계에서 전체 식 (1.9)을 평가 한 결과 (어휘 적으로) 만들어진 위치 인 이 포함 된 것으로 평가됩니다. 이 평가가 인데도 예외가 발생하더라도 마찬가지입니다.

12.2/4 및 12.2/5 이상, 특히이 규칙의 예외 사항이 있습니다.

내가 빠진 ...을 반환 할 때 어떤 일이 발생하는지 알 수 없지만이 문제에 관해서는 묻지 않았습니다.

+7

현재 "x"에 대한 상점이 전체 표현식. http://llvm.org/bugs/show_bug.cgi?id=9783을 참조하십시오. 그러나위원회와 (희망적으로) 사용자 모두가 강력하게 원하는 바입니다. 그러나 그것과는 별도로, * foo (lvalue-to-rvalue)에 의해 반환 된 참조의 전체 표현식의 일부입니다 1.9p10 및 그 예문 참조 –

+0

빠른 응답 주셔서 감사합니다! 예, 그 케이스는 안전합니다 - 그것을 제외시켰다 (추가적인 매개 변수로서 참조에 의해 전달 된 집합의 요소에 대한 참조). – peterchen