Boost пытается создать набор диапазонов для контейнеров, которые вы передаете, и в итоге он вызывает range_detail::is_char_ptr()
, который является именем набора шаблонов функций, который использует вычет параметра шаблона, чтобы определить, является ли параметр char
указатель какой-то или нет (как можно догадаться по названию).
К сожалению, шаблон функции 'catch-all', который возвращает 0
при сопоставлении параметров без указателей на символы, принимает свой параметр по значению.
Я думаю, что это можно исправить, изменив параметр на const&
. Смотрите в файле boost/range/as_literal.hpp
для:
template< class T >
inline long is_char_ptr( T /* r */ )
{
return 0L;
}
и измените его на:
template< class T >
inline long is_char_ptr( T const& /* r */ ) // <-- add const&
{
return 0L;
}
Я ни в коем случае не эксперт по реализации сложных библиотек шаблонов (я их использую, я их не пишу), поэтому я не утверждаю, что это изменение не вызовет какой-то другой неприятной стороны. эффект.