请看下面的代码:
template<typename T>
struct A
{
T i;
// friend bool operator<(A const& l, A const& r) { return l.i < r.i; }
};
template<typename T> bool operator<(A<T> const& l, A<T> const& r) { return l.i < r.i; }
struct B
{
float f;
template<typename T> operator A<T>() const { return A<T>{static_cast<T>(f)}; }
};
int main()
{
bool a = A<int>{3} < A<int>{4};
bool b = A<int>{3} < B{5.4f};
}
通过 friend operator 实现的比较可以支持 A 与 B 的比较,而在外面直接实现 operator 则会导致 A 与 B 的比较编译出错,参考:
https://godbolt.org/z/xsBlnA
这是为啥呢?如果不借助 friend 如何才能使得 A 与 B 可以正常比较?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.