2015-01-05 158 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()