我什么时候应该使用const?

dvi*_*ino 8 c++ const reference this

我发现了一些这样的代码:

class foo{
    int a;
public:
    foo(int v) : a{v} {}
    bool operator==(const foo& rhs) const&{
        return (rhs.a == a);
    }
};
Run Code Online (Sandbox Code Playgroud)

它编译并运行.

我想知道在运算符==中对此引用(&)有什么好处(或缺点).

Ben*_*igt 4

正如 TC 在评论中指出的那样,这样做的原因不是“只接受左值”。 const引用可以很好地绑定到右值。

其原因是,仅当所有重载都指定值类别时,才可以在隐式对象参数的值类别上重载函数。也就是说,当您添加仅匹配右值的重载时,除非您添加到现有重载&&,否则它不会编译。&

在 13.1 中,规则的措辞如下:

具有相同名称和相同 参数类型列表的 成员函数声明以及具有相同名称、相同参数类型列表和相同模板参数列表的成员函数模板声明,如果其中有任何一个都不能被重载,但是不是全部,有一个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
};
Run Code Online (Sandbox Code Playgroud)