我发现了一些像这样的代码:
class foo{
int a;
public:
foo(int v) : a{v} {}
bool operator==(const foo& rhs) const&{
return (rhs.a == a);
}
};
它编译并运行。
我想知道在运算符中使用引用(&)有什么好处(或缺点)==。
答案 0 :(得分:4)
作为T.C.一直在评论中指出,这个原因并不是只接受左值"。 const
引用绑定到rvalues就好了。
原因是只有当ALL重载指定了值类别时,才能在隐式对象参数的值类别上重载函数。也就是说,当你添加一个仅与rvalues匹配的&&
的重载时,除非你将&
添加到现有的重载中,否则它不会编译。
在13.1中,这是规则的措辞:
具有相同名称和相同 parameter-type-list 的成员函数声明以及具有相同名称的成员函数模板声明,相同的 parameter-type-list ,同样的 如果模板参数列表中的任何一个(但不是全部)具有 ref-qualifier ,则不能重载模板参数列表。
并举一个例子
class Y { void h() &; void h() const &; // OK void h() &&; // OK, all declarations have a ref-qualifier void i() &; void i() const; // ill-formed, prior declaration of i // has a ref-qualifier };