惰性求值和 const 正确性问题
Posted
技术标签:
【中文标题】惰性求值和 const 正确性问题【英文标题】:Lazy evaluation and problems with const correctness 【发布时间】:2010-12-20 22:16:04 【问题描述】:我制作了一个 openGL 相机类,它使用惰性求值通过 getter 函数提供最终投影或模型视图投影矩阵。用户在实例的整个生命周期中提供各种相机参数(FOV、位置等),但不是每次更改参数时都重新计算投影矩阵和/或 MVP 矩阵,而是设置“更改”标志(即旧的缓存矩阵现在无效)。每当用户随后请求更新后的最终矩阵时,都会重新计算它,缓存结果并返回一个 const 引用。
在我打电话给我之前一切都很好:
const QMatrix4x4& oE_GLCamera::getModelViewProjection() const;
来自 const oE_GLCamera 实例的函数...我在应用程序中的任何地方都使用 const 引用从 CAD 视口中提取相机数据而不更改相机,但是如果成员变量无效,我的 getter 函数会对成员变量执行惰性求值 - 因此会破坏 const -正确性。
是否有我不知道的语言功能或设计范例可以帮助解决这个问题?还是惰性求值从根本上与 const 正确性不兼容?我知道 const_cast,我自己从未使用过它,但阅读了一些关于它的内容,归结为:如果你使用它,那么你已经在某个地方出错了。还是会成为我的救星?
我们将不胜感激任何建议, 凸轮
【问题讨论】:
【参考方案1】:是否有我不知道的语言功能或设计范例可以帮助解决这个问题?
也许,mutable
?
标记为mutable
的类的成员始终不是const
,即使它是通过引用或指向所属类的指针(即const
引用或指向const
的指针)来访问的.
【讨论】:
是:缓存值不是对象状态的一部分,因此将其标记为可变是合理的。 是的,就是这样。但是,我不会单独创建一半的数据成员mutable
,而是将所有可变数据移动到自己的 struct
中,并拥有一个 mutable
实例。以上是关于惰性求值和 const 正确性问题的主要内容,如果未能解决你的问题,请参考以下文章