懒惰的评估和const正确性的问题

cma*_*t85 5 c++ const-correctness lazy-evaluation

我制作了一个openGL相机类,它使用延迟评估通过getter函数提供最终投影或模型 - 视图 - 投影矩阵.用户在实例的整个生命周期(FOV,位置等)中提供各种相机参数,但不是每次更改参数时都重新计算投影矩阵和/或MVP矩阵,而是设置"已更改"标志(即旧的缓存矩阵现在无效).只要用户随后请求更新的最终矩阵,就会重新计算,结果缓存,并返回const引用.

一切都听起来不错,直到我打电话给我:

const QMatrix4x4& oE_GLCamera::getModelViewProjection() const;
Run Code Online (Sandbox Code Playgroud)

来自const oE_GLCamera实例的函数...我在我的应用程序中使用const引用来从CAD视口中提取相机数据而不更改相机,但是如果它们无效,我的getter函数会对成员变量执行惰性求值 - 因此会破坏const正确性.

是否有语言功能或设计范例我不知道如何帮助解决这个问题?或者懒惰的评估从根本上与const正确性不兼容?我知道const_cast <>,我自己从未使用过它,但读了一些关于它的内容,可以归结为:如果你使用它,你已经在某个地方出错了.还是会成为我的救世主?

Cam,任何建议都会得到很好的接受

CB *_*ley 15

是否有语言功能或设计范例我不知道如何帮助解决这个问题?

或许,mutable

被标记为一个类的成员mutable是总是非const即使它是通过引用或指针所属类这是一种访问const引用或指针const.

  • 是:缓存值不是对象状态的一部分,因此将其标记为可变是合理的. (7认同)
  • 是的,这是要走的路.但是,我不是将一半的数据成员单独地变成`mutable`,而是将所有可变数据移动到它自己的`struct`中并且有一个`mutable`实例. (3认同)