C++ 为什么标准容器使用函数模板而不是非模板Koenig运算符

C++ 为什么标准容器使用函数模板而不是非模板Koenig运算符,c++,c++11,implicit-conversion,standard-library,reference-wrapper,C++,C++11,Implicit Conversion,Standard Library,Reference Wrapper,这个问题的灵感来自。例如,操作符考虑以下代码(A.h): 模板 甲级{ 公众: T m_x; friend bool operator Well,当时运算符的措辞是:没有Koenig运算符。取而代之的是通过ADL/Koenig查找找到的函数。这不是一个问题,但我认为在发明SGI STL时,它仍然与优化器相关。还要注意,这个函数不需要是朋友(不需要特权访问),因此可能它被认为是一个更干净的解决方案。也许允许此btw的更好方法是将包装操作符添加到std::reference_wrapper,就像它的

这个问题的灵感来自。例如,
操作符考虑以下代码(A.h):

模板
甲级{
公众:
T m_x;

friend bool operator Well,当时
运算符的措辞是:没有Koenig运算符。取而代之的是通过ADL/Koenig查找找到的函数。这不是一个问题,但我认为在发明SGI STL时,它仍然与优化器相关。还要注意,这个函数不需要是朋友(不需要特权访问),因此可能它被认为是一个更干净的解决方案。也许允许此btw的更好方法是将包装操作符添加到
std::reference_wrapper
,就像它的
操作符()
。这里有一个问题:假设您想要重载std::vector的运算符<。根据您的建议,这是否可行?似乎不可能。您的函数将是精确的、非模板匹配,因此定义自己的运算符<将导致歧义错误。而在当前形式中,重载运算符<将起作用因为它优先于模板函数。"std::vector的用户没有合理的方法来重新定义操作符的行为。对于一个向量来说,操作符<没有什么特别重要的内容;它只是以某种合理的默认方式定义的。如果默认实现对您来说没有意义,并且有另一个操作总是您想要的,那么重载运算符SGI STL的发明者之一Lexander Stepanov肯定不同意:
运算符我的观点是,这个特殊运算符没有任何基本的“无序映射/集合没有运算符”
template< class T, class Alloc >
bool operator<( const vector<T,Alloc>& lhs,
                const vector<T,Alloc>& rhs );
template <...>
class vector ... {
  friend bool operator<(const vector& a, const vector& b) {...}
};
template <class T>
class A {
  public:
  T m_x;

  friend bool operator<(const A & lhs, const A & rhs) {
    return lhs.m_x < rhs.m_x;
  }
};
#include "A.h"

namespace buddy {
bool operator<(const A<double> & lhs, const A<double> &rhs) {
    return lhs.m_x > rhs.m_x;
};
}
using namespace buddy;
int main(int argc, char ** argv) {

  A<double> a1;
  A<double> a2;

  a1 < a2;

  return 0;
}
template <class T>
bool operator<(const A<T> & lhs, const A<T> & rhs) {
  return lhs.m_x < rhs.m_x;
}