const中的非const

时间:2012-10-08 10:04:38

标签: c++ const

class A
{
void koo(){}
void foo() const {this->koo();}
};

int main()
{
A a;
a.foo();
}

我试图在const函数中调用非const函数。

error: passing ‘const A’ as ‘this’ argument of ‘void A::koo()’ discards qualifiers [-fpermissive]
  1. 此错误的含义是什么?
  2. 我可以使用mutable关键字,如果是这样,怎么样? (as this post
  3. 我可以使用const_cast吗?如果那样,怎么样? (as this post
  4. 有没有其他方法可以做到这一点?

4 个答案:

答案 0 :(得分:4)

  1. 在功能foo中,this的类型为const A*。为了在其上调用非const函数,您最终会在thiskoo具有相同的值,但键入A*,即它将丢弃const限定符。

  2. 没有

  3. 你可以,因为你碰巧知道koo函数不会修改作为A数据成员的任何const对象(因为(a)函数体是空的并且(b)A没有数据成员,(c)无论如何都在A的非常量实例上调用它。但不要这样做。

  4. koo标记为const成员函数,与foo相同。

答案 1 :(得分:1)

koo未声明为const,这表示可能以某种方式更改对象,这在const对象上是不允许的。 foo的签名表示当前对象(this)应被视为常量。

您需要指定const的{​​{1}}变体:

koo

答案 2 :(得分:0)

如果声明koo不是const(即它修改了对象的内部状态),那么确实foo不是const。

使koo const,foo不是const,或者如果对象的行为类似于“没有状态”但是内部变量必须更新,那么请创建这些变量mutable

mutable int m_accessCount;

答案 3 :(得分:0)

当您将函数声明为const时,您说“此函数从不更改对象”。这允许您在const对象上使用该功能。

在您的情况下,您从const内部调用非const函数,这意味着您无法确保该对象不会更改。这会导致错误,因为const foo()意味着对象在任何情况下都不得更改。

请避免使用const_cast,因为如果使用不当会导致UB。

解决此问题的最佳方法是提供const版本的koo()。编写它的非修改版本,或者(如果它不按原样修改对象)只需添加const关键字。