почему `boost :: lower_bound` принимает аргумент по значению? - PullRequest
6 голосов
/ 02 апреля 2019

Реализация boost::lower_bound (найдено здесь ) в диапазоне 2.0 принимает аргумент по значению.

Почему это так?std::lower_bound принимает аргумент const ref - см. здесь

1 Ответ

1 голос
/ 03 апреля 2019

Хотя трудно точно понять причину этого, следует помнить о двух вещах:

  • Общая причина для передачи по значению заключается в том, что вы в конечном итоге делаете копию в функции. Кроме того, передача по значению может потенциально вызывать конструктор перемещения в 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);
    }


...