Если операторы будут объявлены не являющимися членами друзей без шаблонов
Рассмотрим этот вопрос, который касается следующего кода, который не компилируется:
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 и выбрана в качестве лучшей жизнеспособной перегрузки, и исходный пример был бы скомпилирован. Учитывая это, есть ли причина предпочесть шаблон функции, не являющийся членом, который мы сейчас имеем, или это следует считать дефектом в стандарте?
Ответы
Ответ 1
Учитывая это, есть ли причина предпочесть функцию, не являющуюся членом шаблон, который мы имеем в настоящее время, или это должно считаться дефектом в стандарте?
Причина в том, что ADL может найти правильную функцию или нет. Когда такой поиск требует извлечения замененных параметров шаблона из типа заданного объекта, а затем многократно заменяет их на шаблонный параметр шаблона функции, ADL не может этого сделать из-за отсутствия причин в общем случае, чтобы предпочесть один из способов привязки параметров шаблона к другому. Шаблон функции, не являющийся членом, определенный после, но все еще в области пространства имен этого шаблона (из-за friend
) исключает такую неопределенность.