如何定义一个指向const对象的可变指针?

Nik*_*man 4 c++ pointers const mutable

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

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

在Visual C++中,此代码似乎可以执行我想要的操作:

VARIANT mutable const* m_value;
Run Code Online (Sandbox Code Playgroud)

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

VARIANT const * mutable m_value;
Run Code Online (Sandbox Code Playgroud)

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

警告C4518:'mutable':这里意外的存储类或类型说明符; 忽视

Visual C++是对的,还是我错过了什么?另一个更符合标准的编译器可以表现不同吗?

Mar*_* Ba 8

Comeau online似乎同意VC++.

它也有意义!类成员只能是一次可变的,并且没有指向可变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
Run Code Online (Sandbox Code Playgroud)

m_p3 没有意义 - 你同时将成员声明为"always mutabel"和"always const".


ken*_*ytm 7

VC++是对的.在这种情况下mutable是一个存储类说明符,如static,externregister.就像

int const* static foo;
Run Code Online (Sandbox Code Playgroud)

不会编译,因为说明符必须出现在声明的开头.