Адресное дезинфицирующее средство жалуется.
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 ()
Да, это вызывает неопределенное поведение.
Когда вы связываете константную ссылку с временным, время существования временного объекта расширяется до объема связанной ссылки. В вашем случае это функция bar
, Таким образом, вы не можете получить доступ к временному после bar
функция выхода.
Редактировать:
Посмотрел это в стандарте, и фактически время жизни временного объекта расширено до полного выражения, содержащего bar
, Так что это зависит от того, как BOOST_FOREACH
реализован ли ваш код UB или нет.
От N3337 12.2.5
Временная граница с опорным параметром в
вызов функции (5.2.2) сохраняется до завершения полного
выражение, содержащее вызов.