在子类中,我有一个私有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的正确性:
错误:绑定&#39; const std :: mutex&#39;参考类型 &#39;的std :: lock_guard :: mutex_type&安培; {aka std :: mutex&amp;}&#39;丢弃 限定符
有没有办法使这个符合并以const正确的方式使用std::lock_guard
?只需将其更改为const std::lock_guard
即可。我真的不明白哪个部分有问题,然后我再次对C ++很陌生......
答案 0 :(得分:14)
this
指针隐含const
(它实际上是const SubClass *
类型的右值),因此您正在访问的任何成员都是const
隐式。
如果你可以修改const
函数中的成员对象,那么const
会是什么意思? :)
锁定后卫想要修改互斥锁,锁定和解锁它,但因为它是const
,它不能,这就是问题所在。锁定防护装置是否const
无关紧要,因为这与防护装置修改互斥锁的能力无关。
为了有效地解决此问题,您可以使用一个关键字来标记可以在const
限定函数中修改的成员对象。显然,你不应该滥用这个功能并用它来标记你班级的每个对象:
class SubClass {
/*...*/
private:
mutable std::mutex m;
//^^^^^^^
/*...*/
};