Это вызывает неопределенное поведение?

Адресное дезинфицирующее средство жалуется.

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) сохраняется до завершения полного выражения, содержащего вызов.

Другие вопросы по тегам