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

时间:2010-11-05 10:06:16

标签: c++ pointers const mutable

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

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

在Visual C ++中,这段代码似乎做了我想要的:

VARIANT mutable const* m_value;

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

VARIANT const * mutable m_value;

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

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

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

3 个答案:

答案 0 :(得分: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

m_p3没有意义 - 你同时将成员声明为“always mutabel”和“always const”。

答案 1 :(得分:7)

VC ++是对的。在这种情况下,mutable是存储类说明符,如staticexternregister。就像

int const* static foo;

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

答案 2 :(得分:-2)