주소 소독약이 불평하고 있습니다.이로 인해 정의되지 않은 동작이 발생합니까?
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
}
주소 소독약이 불평하고 있습니다.이로 인해 정의되지 않은 동작이 발생합니까?
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
}
예. FOREACH는 foo 호출에 의해 생성되고 bar()에 전달 된 후에 범위를 벗어난 구조체에 대한 참조에서 발생합니다.
정말입니까? 부스트 문서에 의하면 일시적으로 작동합니다. – balki
http://www.boost.org/doc/libs/1_57_0/doc/html/foreach.html#foreach.introduction.examples – balki
링크 된 텍스트에서 어디에서 볼 수 있습니까? – tinkertime
예, 이로 인해 정의되지 않은 동작이 발생합니다.
임시 참조를 바인딩하면 임시 참조의 수명이 바인딩 된 참조의 범위로 확장됩니다. 귀하의 경우이 기능은 bar
입니다. 따라서 bar
함수가 종료 된 후에는 임시 액세스 할 수 없습니다.
편집 :
표준에서 그것을 고개를 실제로 임시의 수명이 bar
를 포함하는 전체 표현식으로 확장됩니다. 따라서 코드가 UB인지 여부에 관계없이 BOOST_FOREACH
이 구현되는 방식에 따라 다릅니다. N3337 12.2.5
함수 호출 (5.2.2)에서 기준 파라미터에 임시 경계에서
전화를 포함하는 전체 식의 완료까지 지속.
그러나 임시가 다른 참조에서 잡히지 않습니까? 따라서 그 참조까지 수명을 연장 할 수 있을까요? – balki
@balki AFAIK 일시적 리 바인딩과 같은 것은 없습니다. –
_ "주소 소독원이 불평하고 있습니다"_ 정확히 _about_을 (를) 불평합니까? –