应该操作符声明为非成员非模板友元
Should operators be declared as non-member non-template friends
考虑这个问题,它是关于以下代码无法编译的:
std::vector<int> a, b;
std::cout << (std::ref(a) < std::ref(b));
不能编译,因为vector
的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发现并选择为最佳可行过载,并编译原始示例。考虑到这一点,是否有理由更喜欢我们目前拥有的非成员函数模板,或者这应该被认为是标准中的缺陷?
既然如此,是否有理由选择非成员函数模板,或者这应该被认为是一个缺陷在标准中?
原因在于ADL能否找到合适的功能。当这样的搜索需要从给定对象的类型中提取被替换的模板参数,然后将它们多次替换为函数模板的模板化参数时,ADL不能这样做,因为在一般情况下没有理由选择一种模板参数绑定到另一种方式。在该模板之后定义但仍在该模板的命名空间范围内的非成员函数模板(由于friend
)排除了这种不确定性。
相关文章:
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 如何启用友元类的友元功能直接在C++中访问其私有成员
- C++:成员不可访问-使用友元函数允许一个类修改另一个类的成员数据
- 如何将一个类的成员函数用作另一类的友元函数
- 友元函数无法访问私有类成员
- 友元类声明和成员函数声明
- 友元类对象是否可以在其成员函数中访问派生类对象的基类私有成员?
- C++重载友元函数无法访问私有成员
- 友元函数将内存分配给数组成员是否有任何限制?
- 成员函数与友元函数:为什么是一个而不是另一个?
- 类具有友元函数.该函数在不同的头文件中的同名 apce 中定义.它无法访问私有成员
- 在子类函数中访问超类友元的受保护数据成员
- 成员函数在C++中用作友元函数
- C++中的友元成员函数 - 转发声明不起作用
- 友元函数看不到私有成员变量
- 如何在不使用友元类的情况下通过另一个类访问一个类的私有成员
- 模板类友元运算符成员函数
- 在基/派生类的成员函数/友元函数中派生* 到 Base* 的转换