2016-09-20 75 views
1

我在單個類中有一個重載的成員函數。如何顯式調用成員函數的const版本?

class A 
{ 
public: 
    int mass() const {return m_mass;} 
protected: 
    int& mass() {return m_mass;} 
private: 
    int m_mass; 
}; 

但具有A類,則將導致重載函數的非const版本的非const實例默認被稱爲:兩個返回類型,const修飾的區別

int main() 
{ 
    A a; 
    return (const int)a.mass(); 
} 

error: int& A::mass() is protected within this context

在這種情況下,const版本如何明確調用?

+2

'((const的A&)一).mass()'? – skypjack

回答

4

C++ 17將引入std::as_const,這是一個非常簡單的工具,你可以實現自己在那之前:

A a; 
std::as_const(a).mass(); 
4

您只需使用一個指定的const引用它,或者更好的是,使用const_cast來獲取一個未命名的const引用,然後調用。

int main() 
{ 
    A a; 

    //1 
    const A& a_const = a; 
    a_const.mass();     

    //2 
    const_cast<const A&>(a).mass(); 

    //3 
    //in C++17 
    //std::as_const(a).mass();   //3 
} 

用C++ 17,以後你可以使用std::as_const

+0

@Barry,固定。謝謝。雖然,前代碼仍然是正確的。 (因爲'static_cast'也可以引入'cv'限定符),'static_cast'可能會發生額外的意外轉換。我曾經被這樣的事情弄糊塗了。 :-) – WhiZTiM

+1

是的,這是正確的,但'const_cast'抵禦你剛剛提到的所有其他事情。另外,它更加明確。我們是const施放。 – Barry