缓存方法结果时如何处理constness?

How to deal with constness when the method result is cached?

我有一个 class,其方法 (getter) 执行一些相对昂贵的操作,所以我想缓存它的结果。调用方法不会改变对象的行为,但需要将其结果存储在this中,所以不能是const.

问题是我现在有另一个常量方法,我需要调用我的 getter。这个问题有一些普遍接受的解决方案吗?我应该绕过 getter 中的常量检查以使其成为常量,(这不会导致优化编译器出现问题吗?)或者我必须将非常量传播到使用此 getter 的所有方法?

示例:

class MyClass
{
public:
    Foo &expensiveGetter() /*const?*/
    {
        if (cachedValue == nullptr) {
            cachedValue = computeTheValue();
        }
        return *cachedValue;
    }

    void myMethod() /* How to make this const? */
    {
        auto &foo = expensiveGetter();
        // etc.
    }

private:
    Foo *cachedValue = nullptr;
}

我正在寻找类似 Rust 中的 RefCell 的东西。

这是 mutable specifier 特别适合的情况之一。当 class 成员是 mutable 时,即使封闭的 class 是 const.

也可以更改该成员

因此,如果 MyClass::cachedValuemutable Foo* 而不是 Foo*,您可以在 MyClass 中使用 const 成员函数来更改 cachedValue 然后所有调用代码都可以正常作用于 const MyClass