0

特定の関数/コードブロックに対してのみメンバー変数を変更可能と見なすことは可能ですか?

例えば

class Foo() {
  int blah;
  void bar() const {
    blah = 5; // compiler error
  }
  void mutable_bar() const {
    blah = 5; // no compiler error
  }
}

注: この場合、論理 const が保持されるため、mutable_bar の const を削除したくありません。

同じ質問ですが、視点が異なります:可変キーワードを変数ではなくメソッドに適用できますか?

4

3 に答える 3

3

いいえ、少なくとも C++ では不可能です。mutableどちらかまたは非const機能が必要です。
またconst_cast、物事を変更するために使用しないでください。const_casted値を変更するconstと、未定義の動作が発生します。

5.2.11 定数キャスト

7 [ 注: オブジェクトのタイプによっては、const-qualifier73 をキャストする const_cast から生じるポインター、左辺値、またはデータ メンバーへのポインターを介した書き込み操作は、未定義の動作を引き起こす可能性があります(7.1.6.1)。—終わりのメモ]

7.1.6.1 cv 修飾子

4 ミュータブル (7.1.1) と宣言されたクラス メンバーは変更できることを除いて、const オブジェクトの有効期間中 (3.8) に変更を試みると、未定義の動作が発生します。
....
5 別の例

struct X {
mutable int i;
int j;
};
struct Y {
X x;
Y();
};
const Y y;
y.x.i++; // well-formed: mutable member can be modified
y.x.j++; // ill-formed: const-qualified member modified
Y* p = const_cast<Y*>(&y); // cast away const-ness of y
p->x.i = 99; // well-formed: mutable member can be modified
p->x.j = 99; // undefined: modifies a const member
—end example ]
于 2013-04-27T19:32:37.920 に答える
1

constこの場合、次のようにして をバイパスすることが技術的に可能です。

void mutable_bar() const {
    int& p_blah = const_cast<int&>(blah);

    p_blah = 5; // no compiler error
}

または、いくつかの同様の構造。しかし、あなたは本当にできるはずのないことをするために、フープを飛び越えています. また、別の投稿のコメントにあるように、これは「未定義の動作」です。つまり、場合によっては機能しない (または期待どおりに動作しない) こともあります。

于 2013-04-27T19:36:54.783 に答える
0

const_cast選択したケースでは、 a を使用してメンバーを非定数にすることができます。これは、それに応じたコメントとともに、比較的クリーンなソリューションである可能性さえあります。少なくとも、世界的に変更可能にするのではなく、制限されたスコープで const を壊すことは明らかです。

于 2013-04-27T19:34:09.930 に答える