2015-01-05 173 views
7

我可以看到类似下面的是有用的:为什么不能重载RHR功能?

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

    vector<int> vals() && { 
     return std::move(val); 
    } 
private: 
    vector<int> val; 
} 

但我与G ++编译器错误:

error: ‘vector<int> A::vals() &&’ cannot be overloaded 

我想你可以做同样超载您可以使用const功能。这对于上面的访问器不太有用,对操​​作员更有用。

+2

你班上没有'foo'功能..? –

+0

你不能用一些* ref-qualifier *重载一些没有的东西。 –

+0

@AndréCaron对不起,我从我做的测试中复制了这个bug。修复。 – IdeaHat

回答

11

原因是C++ 11 13.1/2:

...

  • 成员函数具有相同名称声明和相同参数类型列表 - 如以及成员 具有相同名称的函数模板声明,相同的参数类型列表,和相同的 模板参数列表不能重载,如果它们中的任何一个但不是全部具有ref-qualifier(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 
    }; 
    

    末端例如]

在ohter也就是说,如果你增加了一个裁判限定符到你的例子会工作const超载vals()