gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:37 26 4
gpt4 key购买 nike

考虑以下代码:

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。但是函数签名隐藏了可变声明。

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

最佳答案

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

The restrictions on cv-qualification, and the manner in which the cv-qualifiers of the operands are combined to produce the cv-qualifiers of the result, are the same as the rules for E1.E2 given in 5.2.5. [Note: it is not possible to use a pointer to member that refers to a mutable member to modify a const class object. For example,

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>();
}
};

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

关于c++ - 如何创建指向可变成员的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com