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

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

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
}

-1

Решение

Да. FOREACH происходит со ссылкой на структуру, которая была создана вызовом foo и вышла из области видимости после того, как была передана в bar ()

1

Другие решения

Да, это вызывает неопределенное поведение.

Когда вы связываете константную ссылку с временным, время существования временного объекта расширяется до объема связанной ссылки. В вашем случае это функция bar, Таким образом, вы не можете получить доступ к временному после bar функция выхода.

Редактировать:

Посмотрел это в стандарте, и фактически время жизни временного объекта расширено до полного выражения, содержащего bar, Так что это зависит от того, как BOOST_FOREACH реализован ли ваш код UB или нет.

От N3337 12.2.5

Временная граница с опорным параметром в
вызов функции (5.2.2) сохраняется до завершения полного
выражение, содержащее вызов.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector