mutable,顾名思义表示变量是可变的,与const唱对台戏。不结合实际情况根本让人搞不明白它的意义在哪里,下面结合实例说一下。
假设我们要封装一个多线程下安全使用的vector,大概如下
#include <vector>
#include <mutex>
template<class T>
class ConcurrentVecor{
public:
//省略其他代码
bool isEmpty() const{
std::lock_guard<std::mutex> locker(m_mutex);
return m_vec.isEmpty();
}
private:
std::vector<T> m_vec;
std::mutex m_mutex;
}
这个代码是编译不通过的,因为lock_guard的构造函数为:
explicit lock_guard(mutex_type& m);
传入的nonconst引用,所以isEmpty不能在后面加上const。这就挺蛋疼了呀,这个函数对于使用者而言,就是没有修改任何数据,但是后面又不能戴上const。不加当然也没事儿,但是对于对于阅读代码的人而言,没有那么直观了(其实就是强迫症)。
此时,在m_mutex上加一个mutable,问题就迎刃而解。
划重点:mutable只能用于成员变量,被修饰的变量可以在const成员函数中改变状态。