C++ 惰性评估与常量正确性问题

C++ 惰性评估与常量正确性问题,c++,lazy-evaluation,const-correctness,C++,Lazy Evaluation,Const Correctness,我制作了一个openGL camera类,它使用惰性评估通过getter函数提供最终投影或模型视图投影矩阵。用户在实例的整个生命周期(视野、位置等)内提供各种相机参数,但不是在每次参数更改时重新计算投影矩阵和/或MVP矩阵,而是设置“更改”标志(即,旧的缓存矩阵现在无效)。然后,每当用户请求更新的最终矩阵时,都会重新计算它,缓存结果,并返回常量引用 一切听起来都很好,直到我打电话给我的: const QMatrix4x4& oE_GLCamera::getModelViewProject

我制作了一个openGL camera类,它使用惰性评估通过getter函数提供最终投影或模型视图投影矩阵。用户在实例的整个生命周期(视野、位置等)内提供各种相机参数,但不是在每次参数更改时重新计算投影矩阵和/或MVP矩阵,而是设置“更改”标志(即,旧的缓存矩阵现在无效)。然后,每当用户请求更新的最终矩阵时,都会重新计算它,缓存结果,并返回常量引用

一切听起来都很好,直到我打电话给我的:

const QMatrix4x4& oE_GLCamera::getModelViewProjection() const;
来自const oE_GLCamera实例的函数。。。我在我的应用程序中到处使用const引用从CAD视口中提取相机数据,而不更改相机,但是如果成员变量无效,我的getter函数会对其执行延迟计算,因此会破坏const的正确性

有没有我不知道的语言特性或设计范例可以帮助解决这个问题?或者懒惰的计算从根本上与常量正确性不兼容?我知道const_cast,我自己从来没有用过它,但我读过一些关于它的东西,这些东西可以归结为:如果你用过它,你已经在某个地方出了问题。还是会成为我的救世主

任何建议都会被大量接受, 凸轮

有没有我不知道的语言特性或设计范例可以帮助解决这个问题

也许,
可变的


标记为
mutable
的类的成员始终是非
const
的,即使它是通过指向所属类的引用或指针访问的,该类是
const
引用或指向
const

的指针。是:缓存的值不是对象状态的一部分,因此将其标记为mutable是合理的。是,这就是路。但是,我不想让一半的数据成员
mutable
,而是将所有可变数据移动到它自己的
struct
中,并拥有一个
mutable
实例。