コードは実際にはVC++では機能しません-値を更新していない(または少なくとも更新してはならない)ため、GCCからの警告が表示されます。正しいコードは
const_cast<myType*&>(myMember) = new myType();
または[他の回答から、ありがとう:P]:
const_cast<ThisType*>(this)->myMember = new myType();
効果的に変更可能にするということは、メンバー関数で暗黙const_cast
のsを取得することを意味します。これは、一般に、でsを大量に実行していることに気付いたときに操作する必要があるものです。それ以外に「可変を使用することによる副作用」はありません。const
const_cast
this
この質問をめぐる激しい議論からわかるように、意地悪な使用法mutable
と多くのconst_cast
sは、間違いなくコード内の悪臭の兆候である可能性があります。概念的な観点から、恒常性を捨てたり使用したりするmutable
ことは、はるかに大きな意味を持つ可能性があります。場合によっては、正しい方法は、メソッドをnon-constに変更することです。つまり、状態を変更しているという事実を把握することです。
それはすべて、コンテキストでのconst-correctnessの重要性によって異なります。mutable
ピクシーダストのように散らばって作業を行うことは望ましくmutable
ありませんが、メンバーがオブジェクトの観察可能な状態の一部ではない場合に使用することを目的としています。const-correctnessの最も厳密な見方は、オブジェクトの状態の1ビットを変更できないことを保持します(たとえば、インスタンスがROMにある場合、これは重要かもしれません...)-そのような場合、constnessは必要ありません失われます。また、オブジェクトの外部に外部状態が格納されている場合もあります。たとえば、スレッド固有のキャッシュは、適切かどうかを判断するときに考慮する必要があります。