【问题标题】:How do you define a mutable pointer to a const object?如何定义指向 const 对象的可变指针?
【发布时间】:2010-11-05 10:06:16
【问题描述】:

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

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

在 Visual C++ 中,这段代码似乎可以满足我的要求:

VARIANT mutable const* m_value;

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

VARIANT const * mutable m_value;

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

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

Visual C++ 是否正确,还是我遗漏了什么?另一个更符合标准的编译器是否会有不同的行为?

【问题讨论】:

    标签: c++ pointers constants mutable


    【解决方案1】:

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

    这也是有道理的!一个类成员只能是可变的一次,并且 没有像 指向可变 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”。

    【讨论】:

    • 感谢您的回答! (以及有关 Comeau 在线的提示,将来可能会派上用场)。是的,我想 mutable 的行为(和“绑定”)类似于 static 而不是 const 更有意义。
    【解决方案2】:

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

    int const* static foo;
    

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

    【讨论】:

    • 谢谢,这是一个简短而简洁的回答!以后我会注意不要混淆存储类说明符和类型限定符。
    【解决方案3】:

    【讨论】:

    • 这并没有解决问题。
    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多