4

クラス外の定数 VARIANT 値へのポインターを含むクラスがありますが、このポインターを変更して、クラス自体の VARIANT メンバー オブジェクトを参照したい場合があります。

このクラスのほとんどのインスタンスは const になるため、ポインターを変更可能として宣言する必要があります。

Visual C++では、このコードは私が望むことをしているようです:

VARIANT mutable const* m_value;

ただし、ミュータブルはポインタのプロパティであり、ポインティのプロパティではないため、これは正しい構文であると思います。

VARIANT const * mutable m_value;

定数ポインターを定義する方法に似ています (const オブジェクトへのポインターではありません)。ただし、Visual C++ はこのバリアントを受け入れません。

警告 C4518: 'mutable': ストレージ クラスまたは型指定子が予期されていません。無視された

Visual C++ は正しいですか、それとも何か不足していますか? より標準に準拠した別のコンパイラが異なる動作をする可能性はありますか?

4

3 に答える 3

8

Comeau onlineはここで VC++ に同意しているようです。

そしてそれはまた理にかなっています!クラス メンバーは 1 回だけ変更可能であり、変更可能な const オブジェクトへの非 const ポインターなどはありません。「ミュータブル const オブジェクト」は意味がありません。

たとえば、次mutableのように同じ領域にあるため、宣言の前に を配置する必要があります。static

class A {
  static  int const* m_p1; // static modifiable pointer to a const object;
  mutable int const* m_p2; // mutable pointer to a const object
  ...
  mutable int *const m_p3; // DOES NOT MAKE sense

m_p3意味がありません-メンバーを「常に変更」および「常に定数」として同時に宣言します。

于 2010-11-05T10:23:01.123 に答える
7

VC++は正しいです。この場合は、 、 、などmutableのストレージ クラス指定子です。と同じようにstaticexternregister

int const* static foo;

指定子は宣言の先頭に表示する必要があるため、コンパイルされません。

于 2010-11-05T10:13:16.603 に答える
-2

const オブジェクトへの変更可能なポインターをどのように定義しますか? を参照してください。

于 2010-11-05T10:17:43.913 に答える