Подтвердить что ты не робот

Если операторы будут объявлены не являющимися членами друзей без шаблонов

Рассмотрим этот вопрос, который касается следующего кода, который не компилируется:

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 и выбрана в качестве лучшей жизнеспособной перегрузки, и исходный пример был бы скомпилирован. Учитывая это, есть ли причина предпочесть шаблон функции, не являющийся членом, который мы сейчас имеем, или это следует считать дефектом в стандарте?

4b9b3361

Ответ 1

Учитывая это, есть ли причина предпочесть функцию, не являющуюся членом шаблон, который мы имеем в настоящее время, или это должно считаться дефектом в стандарте?

Причина в том, что ADL может найти правильную функцию или нет. Когда такой поиск требует извлечения замененных параметров шаблона из типа заданного объекта, а затем многократно заменяет их на шаблонный параметр шаблона функции, ADL не может этого сделать из-за отсутствия причин в общем случае, чтобы предпочесть один из способов привязки параметров шаблона к другому. Шаблон функции, не являющийся членом, определенный после, но все еще в области пространства имен этого шаблона (из-за friend) исключает такую ​​неопределенность.