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]
答案 0 :(得分:4)
在功能foo
中,this
的类型为const A*
。为了在其上调用非const函数,您最终会在this
中koo
具有相同的值,但键入A*
,即它将丢弃const限定符。
没有
你可以,因为你碰巧知道koo
函数不会修改作为A
数据成员的任何const对象(因为(a)函数体是空的并且(b)A
没有数据成员,(c)无论如何都在A
的非常量实例上调用它。但不要这样做。
将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
关键字。