4

我有一个类,它包含一个指向类外部常量 VARIANT 值的指针,但有时我想更改此指针以引用类本身的 VARIANT 成员对象。

这个类的大多数实例都是常量,所以我必须将指针声明为可变的。

在 Visual C++ 中,这段代码似乎符合我的要求:

VARIANT mutable const* m_value;

但是,由于 mutable 是指针的属性而不是指针的属性,我认为这是正确的语法:

VARIANT const * mutable m_value;

类似于定义常量指针(而不是指向 const 对象的指针)。但是,Visual C++ 不接受这种变体。

警告 C4518:“可变”:此处意外的存储类或类型说明符;忽略

Visual C++ 是对的,还是我遗漏了什么?另一个更符合标准的编译器会表现得不同吗?

4

3 回答 3

8

Comeau online似乎同意这里的 VC++。

这也有道理!类成员只能是可变的一次,并且不存在指向可变 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 does not make sense - you declare the member as "always mutabel" and as "always const" at the same time.

于 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 回答