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