Просматривая BOOST_FOREACH
безумие метапрограммирования, я вижу, что коллекция копируется, если она
- значение,
- «облегченный прокси», который вы можете определить для своих типов по специализации
boost::foreach::is_lightweight_proxy
.
Следовательно, lvalue не копируется . Вместо этого его указатель считается временным.
Важный бит это:
# define BOOST_FOREACH_SHOULD_COPY(COL) \
(true ? 0 : boost::foreach_detail_::or_( \
BOOST_FOREACH_IS_RVALUE(COL) \
, BOOST_FOREACH_IS_LIGHTWEIGHT_PROXY(COL)))
Затем он используется в качестве одного из аргументов функции, которая используется для вычисления контейнера во временную переменную:
template<typename T>
inline auto_any<T> contain(T const &t, boost::mpl::true_ *) // rvalue
{
return t;
}
template<typename T>
inline auto_any<T *> contain(T &t, boost::mpl::false_ *) // lvalue
{
// Cannot seem to get sunpro to handle addressof() with array types.
#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x570))
return &t;
#else
return boost::addressof(t);
#endif
}
В моей системе установлен Boost v1.38.