Хотя трудно точно понять причину этого, следует помнить о двух вещах:
Общая причина для передачи по значению заключается в том, что вы в конечном итоге делаете копию в функции. Кроме того, передача по значению может потенциально вызывать конструктор перемещения в prvalues / xvalues и конструктор копирования в lvalues.
В последних версиях библиотеки Boost boost::lower_bound
использует std::lower_bound
в своей реализации. Boost 1.59 имеет следующую реализацию для перегрузок boost::lower_bound
, указанных в вашей ссылке:
template< class ForwardRange, class Value >
inline BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type
lower_bound( const ForwardRange& rng, Value val )
{
BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<const ForwardRange> ));
return std::lower_bound(boost::begin(rng), boost::end(rng), val);
}
template< range_return_value re, class ForwardRange, class Value >
inline BOOST_DEDUCED_TYPENAME range_return<const ForwardRange,re>::type
lower_bound( const ForwardRange& rng, Value val )
{
BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<const ForwardRange> ));
return range_return<const ForwardRange,re>::
pack(std::lower_bound(boost::begin(rng), boost::end(rng), val),
rng);
}