为什么“boost::lower_bound”按值进行论证?

why does `boost::lower_bound` take its argument by value?

提问人:wreckgar23 提问时间:4/2/2019 更新时间:2/15/2020 访问量:177

问:

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

为什么会这样? 通过 const ref 获取其论点 - 请参阅此处std::lower_bound

C++ 加速 提升范围

评论

0赞 Maxim Egorushkin 4/2/2019
它似乎依靠编译器来消除不必要的副本。
0赞 user14717 4/3/2019
错误报告?似乎是一个容易犯的错误。
0赞 wreckgar23 4/3/2019
@user14717就可以了。该库至少有五年的历史(可能更旧),所以我预计有一个实施原因。如果我收到回复,将更新问题
0赞 wreckgar23 4/4/2019
在此处添加了一个问题

答:

1赞 P.W 4/3/2019 #1

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

  • 按值传递的一般原因是当您最终在函数中创建副本时。此外,按值传递可能会调用 prvalues/xvalues 上的移动构造函数和左值上的复制构造函数。

  • 在最新版本的 boost 库中,在其实现中使用。Boost 1.59 对链接中提到的重载有以下实现:boost::lower_boundstd::lower_boundboost::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);
    }


评论

0赞 wreckgar23 4/3/2019
范围算法是在 1.43 版中引入的。我查看了 1.43 实现,他们也使用std::lower_bound
1赞 P.W 4/3/2019
@wreckgar23:所以,第二点在这里无关紧要。让我们看看其他人是否可以为此提供更完整的答案。
1赞 wreckgar23 2/15/2020 #2

此问题现已修复

按价值来论证可能有历史原因。请参阅此答案,了解通过值传递给标准算法的函数对象。