如何创建指向可变成员的指针?

时间:2010-04-20 12:57:04

标签: c++ templates const mutable pointer-to-member

请考虑以下代码:

struct Foo
{
    mutable int m;

    template<int Foo::* member> 
    void change_member() const {
        this->*member = 12; // Error: you cannot assign to a variable that is const
    }

    void g() const {
    change_member<&Foo::m>();
    }
};

编译器生成错误消息。问题是成员m是可变的,因此可以更改m。但是函数签名隐藏了可变的声明。

如何对指向可变成员的指针进行十进制编译以编译此代码? 如果不可能,请链接到标准C ++。

1 个答案:

答案 0 :(得分:8)

根据C ++标准5.5 / 5,此代码格式错误:

  

对cv资格的限制,   以及的方式   操作数的cv限定符是   结合起来制作cv-qualifiers   结果,与...相同   5.2.5中给出的E1.E2规则。 [注意:   无法使用指向引用mutable的成员的指针   修改const类的成员   对象   例如,

struct S {
  mutable int i;
};
const S cs;
int S::* pm = &S::i; // pm refers to mutable member S::i
cs.*pm = 88;         // ill-formed: cs is a const object
     

您可以使用包装器类来解决此问题,如下所示:

template<typename T> struct mutable_wrapper { mutable T value; };

struct Foo
{
    mutable_wrapper<int> m;

    template<mutable_wrapper<int> Foo::* member> 
    void change_member() const {
        (this->*member).value = 12; // no error
    }

    void g() const {
    change_member<&Foo::m>();
    }
};

但我认为您应该考虑重新设计代码。