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

Ale*_*tov 5 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>();
    }
};
Run Code Online (Sandbox Code Playgroud)

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

如何对指向mutable-member的decalre来编译这段代码?如果不可能,请链接到标准C++.

Kir*_*sky 8

根据C++标准5.5/5,此代码格式不正确:

对cv资格的限制,以及操作数的cv限定符组合以产生结果的cv限定符的方式,与5.2.5中给出的E1.E2的规则相同.[注意: 不可能使用指向成员的指针来引用可变成员来修改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
Run Code Online (Sandbox Code Playgroud)

]

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

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>();
    }
};
Run Code Online (Sandbox Code Playgroud)

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