Этот вопрос вдохновлен Проблема с std:: reference_wrapper. Скажем, например, operator<
для std::vector
. Он определяется как шаблон функции как
template< class T, class Alloc >
bool operator<( const vector<T,Alloc>& lhs,
const vector<T,Alloc>& rhs );
В результате неявное преобразование аргумента функции в тип соответствующего параметра функции отрицается (в основном из-за его характера шаблона). Это значительно снижает полезность и удобство std::reference_wrapper
. Например, вы не можете использовать std::sort
на std::vector<std::reference_wrapper<std::vector<int>>>
.
С другой стороны, все проблемы решаются, только если operator<
определяется как не-шаблонный оператор Koenig, например
template <...>
class vector ... {
friend bool operator<(const vector& a, const vector& b) {...}
};
Мне интересно, почему стандартная библиотека приняла вместо этого прежний подход?