typedef vector<string> vec;В моем случае был, конечно не vector
vec get_vector();
void test()
{
// отлично компилируется
get_vector().push_back("oh god, it's writable!");
// получаем невозможность сконвертировать const string в string&
BOOST_FOREACH(string& s, get_vector())
{
...
}
}
Но ведь в том же бусте есть прокси-контейнеры (iterator_range и ко), неужели не подумали о них? Очень не верится.
И я не ошибался свято веря в создателей foreach - с iterator_range приведенная конструкция успешно работает! Оказывается, для определения прокси-контейнеров предусмотрен специальный хак (по-другому не назовешь) - boost_foreach_is_lightweight_proxy.
Однако ни использование ::boost_foreach_is_lightweight_proxy, ни boost::foreach::is_lightweight_proxy почему-то не помогло мне скомпилировать приведенный выше код:
inline boost::mpl::true_ *Вот теперь думаю - то ли я тупой, то ли сани не едут.
boost_foreach_is_lightweight_proxy(vec *&, boost::foreach::tag) { return 0; }
Комментариев нет:
Отправить комментарий