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++.
根据C++标准5.5/5,此代码格式不正确:
对cv资格的限制,以及操作数的cv限定符组合以产生结果的cv限定符的方式,与5.2.5中给出的E1.E2的规则相同.[注意: 不可能使用指向成员的指针来引用可变成员来修改const类对象. 例如,
Run Code Online (Sandbox Code Playgroud)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>();
}
};
Run Code Online (Sandbox Code Playgroud)
但我认为您应该考虑重新设计代码.
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |