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]
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]
functionfooでは、thistypeを持っていconst A*ます。その上で非 const 関数を呼び出すには、同じ値で type を持つことになりthisます。つまり、const 修飾子を破棄します。kooA*
いいえ。
koo関数がデータメンバーである const オブジェクトを変更しないことがたまたまわかっているため、可能ですA((a) 関数本体が空であり、(b)Aデータメンバーがなく、(c) 非で呼び出されているため)。とにかくの -const インスタンスA)。しかし、そうしないでください。
と同じメンバー関数kooとしてマークします。constfoo
kooは として宣言されていません。これは、const オブジェクトでは許可されていない何らかの方法でオブジェクトを変更できることconstを示しています。のシグネチャは、現在のオブジェクト ( ) が定数であると見なされることを示します。foothis
const次のバリアントを指定する必要がありますkoo。
void koo() const {}
void koo() {}
が const ではないkooと宣言されている (つまり、オブジェクトの内部状態を変更している) 場合、実際にfooは const ではありません。
kooconst ではなく constを作成するfooか、オブジェクトが「状態なし」のように動作するが、更新する必要がある内部変数がある場合は、これらの変数を作成しますmutable。
mutable int m_accessCount;
関数を として宣言すると、「この関数はオブジェクトを決してconst変更しない」と言っています。これにより、オブジェクトに対して関数を使用できます。const
あなたの場合、const 関数内から非 const 関数を呼び出しています。つまり、オブジェクトが変更されないことを保証できません。constonfoo()は、どのような場合でもオブジェクトを変更してはならないことを意味するため、これはエラーにつながります。
const_cast使い方を誤るとUBの原因となりますので、ご使用は避けてください。
これを修正する最善の方法は、 のconstバージョンを提供することですkoo()。それの非変更バージョンを作成するか、(オブジェクトをそのまま変更しない場合)constキーワードを追加するだけです。