2016-09-20 76 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