为什么`boost :: lower_bound`按值接受参数?

时间:2019-04-02 13:42:17

标签: c++ boost boost-range

Range 2.0中boost::lower_bound(在here中的实现)按值接受参数。

这是为什么? std::lower_bound由const ref接受其参数-参见here

2 个答案:

答案 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