考虑this question,这是关于以下不编译的代码:
std::vector<int> a, b;
std::cout << (std::ref(a) < std::ref(b));
它没有编译,因为vector
的向量comparison operators是非成员函数模板,并且不允许考虑隐式转换。但是,如果运算符被写为非成员非模板,friend
函数:
template <class T, class Allocator = std::allocator<T>>
class vector {
// ...
friend bool operator<(const vector& lhs, const vector& rhs) {
// impl details
}
};
然后ADL会找到这个版本的operator<
并被选为最佳可行的重载,并且原始的例子将被编译。鉴于此,是否有理由更喜欢我们目前拥有的非成员函数模板,还是应该将其视为标准中的缺陷?
答案 0 :(得分:1)
鉴于此,是否有理由更喜欢非会员功能 我们目前拥有的模板,或者应该将其视为缺陷 在标准中?
原因是ADL能否找到合适的功能。当这样的搜索需要从给定对象的类型中提取替换的模板参数然后将它们多次替换为函数模板的模板化参数时,ADL不能这样做,因为在一般情况下没有理由偏好模板参数绑定到其他的一种方式。之后定义但仍位于该模板的命名空间范围内的非成员函数模板(由于friend
)排除了这种不确定性。