在一个子类中,我有一个私有(private)的 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 正确性:
error: binding 'const std::mutex' to reference of type 'std::lock_guard::mutex_type& {aka std::mutex&}' discards qualifiers
有没有办法让它符合要求并以常量正确的方式使用 std::lock_guard
?简单地将其更改为 const std::lock_guard
不会有任何改变。我真的不明白哪一部分有问题,然后我又是 C++ 的新手 ...
最佳答案
this
指针隐式为 const
(它实际上是 const SubClass *
类型的右值),因此您访问的任何成员都是 const
隐含地。
如果您可以在const
函数中修改成员对象,那么const
的意义何在? :)
锁守卫想要修改互斥锁,锁定和解锁它,但是因为它是const
,所以它不能,这就是问题所在。 lock guard 是否为const
并不重要,因为这与lock guard 修改互斥体的能力无关。
为了有效解决这个问题,有一个关键字可以用来标记在const
限定函数中可以修改的成员对象。现在很明显,你不应该滥用这个特性并用它标记你类的每个对象:
class SubClass {
/*...*/
private:
mutable std::mutex m;
//^^^^^^^
/*...*/
};
关于c++ - 如何在不违反 const 正确性的情况下使用 std::lock_guard?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48133164/