7

boost::lower_boundRange 2.0 中(在此处找到)的实现按值获取其参数。

为什么是这样? std::lower_bound通过 const ref 接受它的论点 - 见这里

4

2 回答 2

1

虽然很难确定其原因,但有两点需要牢记:

  • 按值传递的一般原因是您最终在函数中进行了复制。此外,按值传递可能会调用纯右值/xvalues 上的移动构造函数和左值上的复制构造函数。

  • 在其实现中boost::lower_bound使用的最新版本的 boost 库中。对于链接中提到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);
    }


于 2019-04-03T05:26:43.790 回答
1

现在这个问题已经解决了。

以价值来看待这个论点可能有历史原因。请参阅有关按值传递给标准算法的函数对象的答案。

于 2020-02-14T17:57:21.367 回答