2016-02-22 4 views
4

std::not1() Прототип выглядит следующим образом:Почему std :: not1() принимает параметр по ссылке const вместо значения?

template< class Predicate > 
std::unary_negate<Predicate> not1(const Predicate& pred); 

Это эффективно запрещает движение семантики. Почему это не прототип, как:

template< class Predicate > 
std::unary_negate<Predicate> not1(Predicate pred); 

Таким образом, копировать или перемещать в зависимости от того, как pred строится. Затем функция просто перемещает pred в объект std::unary_negate.

+3

Они могут добавить дополнительную перегрузку для rvalues, но никто не заботился об этих негритянских помощниках, когда у вас есть лямбда. И скоро они заменили бы универсальной ссылкой, принимающей 'not_fn' в любом случае. –

+0

@hvd Просто удалил 'constexpr' и отступил на C++ 03. – Lingxi

+0

@Lingxi Это кажется мне совершенно разумным, спасибо. – hvd

ответ

5

Было бы совершенно бесполезно сделать это изменение само по себе. То, что not1 делает, представляет собой конструкцию std::unary_negate<Predicate> с использованием pred в качестве аргумента конструктору. Но единственный соответствующий конструктор std::unary_negate<Predicate> принимает const Predicate &, неPredicate &&.

Логический вопрос о последующем будет, почему std::unary_negate<Predicate> не имеет конструктора, принимающего Predicate &&? Очевидно, он не мог принять такой аргумент, когда он был разработан, потому что ссылки rvalue еще не существовали. Что касается позже, это немного догадка, но я бы сказал, что lambdas уже достаточно хорошо заполняют эту проблему, так что в unary_negate не так много смысла, кроме обратной совместимости.

+0

Звучит разумно. Тем не менее, я бы предпочел 'std :: not1()' на лямбда, потому что он проще в синтаксисе и гораздо более интуитивно понятный и читаемый. – Lingxi

+0

@Lingxi Если стандартная библиотека была разработана с нуля, я полагаю, что 'std :: not1' может быть определен как возвращающий неопределенный тип возвращаемого значения, так что он может быть реализован путем возврата лямбда. :) К сожалению, теперь это изменение нарушит совместимость. – hvd

Смежные вопросы