请考虑以下代码:
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 ++。
答案 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>();
}
};
但我认为您应该考虑重新设计代码。