为什么RHR功能不能超载?

Ide*_*Hat 7 c++ c++11

我可以看到以下内容有用:

class A {
public:
   const vector<int>& vals() const {
       return val;
   }

   vector<int> vals() && {
       return std::move(val);
   }
private:
    vector<int> val;
}
Run Code Online (Sandbox Code Playgroud)

但是我用g ++得到了一个编译器错误:

error: ‘vector<int> A::vals() &&’ cannot be overloaded
Run Code Online (Sandbox Code Playgroud)

我认为您可以使用const函数执行相同类型的重载.这对于上述访问器来说不太有用,对操​​作员更有用.

Rei*_*ica 11

原因是C++ 11 13.1/2:

...

  • 具有相同名称和相同参数类型列表的成员函数声明以及具有相同名称的成员函数模板声明,相同的参数类型列表和相同的模板参数列表(如果有的话)不能重载,但不是全部,有一个参考资格赛(8.3.5).

    [ 例如:

    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)

    - 末端的例子 ]

换句话说,如果你在重载中添加了一个ref-qualifier,你的例子就可以const了vals().