这个问题的灵感来自于 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
on std::vector<std::reference_wrapper<std::vector<int>>>
。
另一方面,只有当operator<
定义为非模板 Koenig 算子时,所有问题都得到解决,例如
template <...>
class vector ... {
friend bool operator<(const vector& a, const vector& b) {...}
};
我想知道为什么标准库采用了前一种方法而不是这种方法?