2014-11-19 12 views
-1

주소 소독약이 불평하고 있습니다.이로 인해 정의되지 않은 동작이 발생합니까?

struct X 
{ 
    iterator begin(); 
    iterator end(); 
}; 

X foo(); 

const X& bar(const X& x) 
{ 
    return x; 
} 

BOOST_FOREACH(const auto& xitem, bar(foo())) 
{ 
    //use xitem 
} 
+0

_ "주소 소독원이 불평하고 있습니다"_ 정확히 _about_을 (를) 불평합니까? –

답변

1

예. FOREACH는 foo 호출에 의해 생성되고 bar()에 전달 된 후에 범위를 벗어난 구조체에 대한 참조에서 발생합니다.

+0

정말입니까? 부스트 문서에 의하면 일시적으로 작동합니다. – balki

+0

http://www.boost.org/doc/libs/1_57_0/doc/html/foreach.html#foreach.introduction.examples – balki

+0

링크 된 텍스트에서 어디에서 볼 수 있습니까? – tinkertime

1

예, 이로 인해 정의되지 않은 동작이 발생합니다.

임시 참조를 바인딩하면 임시 참조의 수명이 바인딩 된 참조의 범위로 확장됩니다. 귀하의 경우이 기능은 bar입니다. 따라서 bar 함수가 종료 된 후에는 임시 액세스 할 수 없습니다.

편집 :

표준에서 그것을 고개를 실제로 임시의 수명이 bar를 포함하는 전체 표현식으로 확장됩니다. 따라서 코드가 UB인지 여부에 관계없이 BOOST_FOREACH이 구현되는 방식에 따라 다릅니다. N3337 12.2.5

함수 호출 (5.2.2)에서 기준 파라미터에 임시 경계에서

전화를 포함하는 전체 식의 완료까지 지속.

+0

그러나 임시가 다른 참조에서 잡히지 않습니까? 따라서 그 참조까지 수명을 연장 할 수 있을까요? – balki

+0

@balki AFAIK 일시적 리 바인딩과 같은 것은 없습니다. –