C++ C++;互斥和常量正确性

C++ C++;互斥和常量正确性,c++,C++,对于本质上是只读的,但具有可能需要修改的互斥/锁的方法是否为常量,是否有约定 如果没有,如果这种方法是const 谢谢您可以使用关键字可变标记数据成员,以允许在常量成员函数中修改它们,例如: struct foo { mutable mutex foo_mutex; // .... void bar() const { auto_locker lock(foo_mutex); // ... } }; 尽量少这样做,因为滥

对于本质上是只读的,但具有可能需要修改的互斥/锁的方法是否为常量,是否有约定

如果没有,如果这种方法是
const


谢谢

您可以使用关键字
可变
标记数据成员,以允许在常量成员函数中修改它们,例如:

struct foo 
{
    mutable mutex foo_mutex;
    // ....
    void bar() const
    {
        auto_locker lock(foo_mutex);
        // ...
    }
};

尽量少这样做,因为滥用
mutable
是邪恶的。

对于概念上为
const
的方法,我通常可以使用
mutable
锁和缓存

特别是在缓存性能计算结果的情况下。这是一个严格意义上的实现细节,调用者不应该关心它,因此删除
const
指定就相当于抽象中的一个小漏洞

对于锁,我会问自己,锁是否只是一个私有的实现细节。如果锁与其他对象共享,那么它实际上是接口的一部分


在某些平台上,锁是通过句柄访问的,因此您可以在方法上使用
const
,而不用担心
mutable

谢谢。我想问题其实是关于设计,而不是如何实现AAA@将互斥数据成员标记为可变是一种可接受的用例,因为它不代表对象的真实状态。在我们的产品中,这个关键字使用了三次,其中一次正好是
可变boost::mutex
。总有一天我会想办法摆脱另外两个。谢谢,这也是我的印象,但我不确定这是否合理design@aaa在我们的代码库中,我们还将mutable用于互斥数据成员,另一个可接受的用例是引用计数对象,我指的是实际的引用计数成员。另一种可接受的用例是使用“is_dirty”标志惰性地评估对象。我认为这取决于类的语义:在不同的情况下,不同的方法可能是有意义的。为什么你不想让它保持常量?@Neil我觉得应该避免可变,但看起来互斥是一个很好的选择,所以我想听听它是否合适design@aaa我经常在自己的代码中使用mutable,因此它有我的认可印章,因为它的价值:-)@aaa:我认为决定
mutable
是否可以使用的关键问题是:“这段数据是否表示用户可以看到对象的状态?”如果您回答“是的,它可以”,那么将其设置为
mutable
将滥用
mutable
。如果您回答“否,它不可以”,则
mutable
可能是可以接受的。