答案 0 :(得分:1)
虽然很难确定原因,但有两点需要牢记:
按值传递的一般原因是最终在函数中进行复制时。同样,按值传递可能会在prvalues / xvalues上调用move构造函数,而在lvalues上调用copy构造函数。
在boost库的最新版本中,boost::lower_bound
在其实现中使用std::lower_bound
。对于链接中提到的boost::lower_bound
的重载,Boost 1.59具有以下实现:
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);
}
答案 1 :(得分:1)
此问题现已修复by this issue。
按价值论据可能有历史原因。有关通过值传递给标准算法的函数对象,请参见this answer。