如何在不违反常量正确性的情况下使用 std::lock_guard

How to use a std::lock_guard without violating const correctness?

本文关键字:std lock guard 情况下 正确性 常量      更新时间:2023-10-16

在子类中,我有一个私有std::mutex m字段,我在基类纯虚拟方法的实现中使用它以线程安全的方式返回值(该值可以由另一个线程更新(:

int SubClass::get() const // implements 'virtual int get() = 0 const' of the base class
{            
    std::lock_guard<std::mutex> lck(m); 
    return value;
}

编译器告诉我,这通过产生错误违反了const正确性:

错误:将"const std::mutex"绑定到类型的引用 'std::lock_guard::mutex_type& {aka std::mutex&}' discard 限定 符

有没有办法使其合规并以恒定正确的方式使用std::lock_guard?简单地将其更改为const std::lock_guard不会改变任何事情。我真的不明白哪个部分有问题,然后我对C++又很陌生......

this指针是隐式const的(它实际上是类型 const SubClass * 的右值(,因此您正在访问的任何成员都是隐式const

如果可以在const函数中修改成员对象,那么const的意义何在? :)

卫想要修改互斥锁,锁定和解锁它,但因为它是const,所以它不能,这就是问题所在。锁护罩是否const并不重要,因为这与锁护罩修改互斥锁的能力无关。

为了有效地解决此问题,可以使用一个关键字来标记可以在const限定函数中修改的成员对象。现在很明显,你不应该滥用这个功能并用它标记类的每个对象:

class SubClass {
/*...*/
private:
    mutable std::mutex m;
  //^^^^^^^
/*...*/
};