除了允许变量被const函数修改之外,'mutable'关键字是否有任何其他用途?

除了允许变量被const函数修改之外,'mutable'关键字是否有任何其他用途

前段时间我遇到了一些用mutable关键字标记类的成员变量的代码。据我所知,它只是允许您修改const方法中的变量:

class Foo  {  private:  
    mutable bool done_;  public:  
    void doSomething() const { ...; done_ = true; }  };

这是这个关键字的唯一用途,还是有更多的东西比它的眼睛?我已经在一个类中使用了这个技术,标记为一个boost::mutex可变的允许const函数来锁定它出于线程安全的原因,但是,说实话,它感觉有点像黑客。


尚方宝剑之说
浏览 640回答 3
3回答

LEATH

它允许区分按位const和逻辑const。逻辑const是指对象不会以通过公共接口可见的方式更改,例如锁定示例。另一个例子是一个在第一次请求时计算值的类,并缓存结果。因为mutable可以在lambda上使用c ++ 11 来表示按值捕获的内容是可修改的(默认情况下不是这样):int x = 0;auto f1 = [=]() mutable {x = 42;};  // OKauto f2 = [=]()         {x = 42;};  // Error: a by-value capture cannot be modified in a non-mutable lambda

明月笑刀无情

您对boost :: mutex的使用正是此关键字的用途。另一个用途是用于内部结果缓存以加快访问速度。基本上,'mutable'适用于不影响对象外部可见状态的任何类属性。在您的问题的示例代码中,如果done_的值影响外部状态,则可变性可能不合适,这取决于...中的内容; 部分。
打开App,查看更多内容
随时随地看视频慕课网APP