Рассмотрим этот вопрос, который касается следующего кода, который не компилируется:
std::vector<int> a, b;
std::cout << (std::ref(a) < std::ref(b));
Он не компилируется, потому что векторные операторы сравнения для vector
являются шаблонами функций, не являющихся членами, а неявные преобразования не являются разрешено рассматривать. Однако, если операторы вместо этого были записаны как не-членный шаблон, friend
функции:
template <class T, class Allocator = std::allocator<T>>
class vector {
// ...
friend bool operator<(const vector& lhs, const vector& rhs) {
// impl details
}
};
Тогда эта версия operator<
была бы найдена ADL и выбрана в качестве лучшей жизнеспособной перегрузки, и исходный пример был бы скомпилирован. Учитывая это, есть ли причина предпочесть шаблон функции, не являющийся членом, который мы сейчас имеем, или это следует считать дефектом в стандарте?