除了允许变量被const函数修改之外,'mutable'关键字是否有任何其他用途前段时间我遇到了一些用mutable关键字标记类的成员变量的代码。据我所知,它只是允许您修改const方法中的变量:class Foo { private:
mutable bool done_; public:
void doSomething() const { ...; done_ = true; } };这是这个关键字的唯一用途,还是有更多的东西比它的眼睛?我已经在一个类中使用了这个技术,标记为一个boost::mutex可变的允许const函数来锁定它出于线程安全的原因,但是,说实话,它感觉有点像黑客。?
3 回答
LEATH
TA贡献1936条经验 获得超6个赞
它允许区分按位const和逻辑const。逻辑const是指对象不会以通过公共接口可见的方式更改,例如锁定示例。另一个例子是一个在第一次请求时计算值的类,并缓存结果。
因为mutable
可以在lambda上使用c ++ 11 来表示按值捕获的内容是可修改的(默认情况下不是这样):
int x = 0;
auto f1 = [=]() mutable {x = 42;}; // OK
auto f2 = [=]() {x = 42;}; // Error: a by-value capture cannot be modified in a non-mutable lambda
明月笑刀无情
TA贡献1828条经验 获得超4个赞
您对boost :: mutex的使用正是此关键字的用途。另一个用途是用于内部结果缓存以加快访问速度。
基本上,'mutable'适用于不影响对象外部可见状态的任何类属性。
在您的问题的示例代码中,如果done_的值影响外部状态,则可变性可能不合适,这取决于...中的内容; 部分。
- 3 回答
- 0 关注
- 639 浏览
添加回答
举报
0/150
提交
取消