0
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 キーワードを使用できますか? (この投稿として
  3. これに const_cast を使用できますか。もしそうなら、どのように?(この投稿として
  4. これを行う他の方法はありますか?
4

4 に答える 4

4
  1. functionfooでは、thistypeを持っていconst A*ます。その上で非 const 関数を呼び出すには、同じ値で type を持つことになりthisます。つまり、const 修飾子を破棄します。kooA*

  2. いいえ。

  3. koo関数がデータメンバーである const オブジェクトを変更しないことがたまたまわかっているため、可能ですA((a) 関数本体が空であり、(b)Aデータメンバーがなく、(c) 非で呼び出されているため)。とにかくの -const インスタンスA)。しかし、そうしないでください。

  4. と同じメンバー関数kooとしてマークします。constfoo

于 2012-10-08T10:08:53.970 に答える
1

kooは として宣言されていません。これは、const オブジェクトでは許可されていない何らかの方法でオブジェクトを変更できることconstを示しています。のシグネチャは、現在のオブジェクト ( ) が定数であると見なされることを示します。foothis

const次のバリアントを指定する必要がありますkoo

void koo() const {}
void koo() {}
于 2012-10-08T10:06:19.390 に答える
0

が const ではないkooと宣言されている (つまり、オブジェクトの内部状態を変更している) 場合、実際にfooは const ではありません。

kooconst ではなく constを作成するfooか、オブジェクトが「状態なし」のように動作するが、更新する必要がある内部変数がある場合は、これらの変数を作成しますmutable

mutable int m_accessCount;
于 2012-10-08T10:08:04.750 に答える
0

関数を として宣言すると、「この関数はオブジェクトを決してconst変更しない」と言っています。これにより、オブジェクトに対して関数を使用できます。const

あなたの場合、const 関数内から非 const 関数を呼び出しています。つまり、オブジェクトが変更されないことを保証できません。constonfoo()は、どのような場合でもオブジェクトを変更してはならないことを意味するため、これはエラーにつながります。

const_cast使い方を誤るとUBの原因となりますので、ご使用は避けてください。

これを修正する最善の方法は、 のconstバージョンを提供することですkoo()。それの非変更バージョンを作成するか、(オブジェクトをそのまま変更しない場合)constキーワードを追加するだけです。

于 2012-10-08T10:11:44.887 に答える