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