如何在保留const正确性的前提下跟踪类的所有实例?
实例跟踪中的const正确性问题
在部分场景中,我们需要在容器内跟踪某个类的全部实例,Stack Exchange上已有相关讨论。我在处理该需求时发现,自动将实例注册到容器的方式易破坏const正确性。
这是由于构造过程中this指针始终被视为非const类型,无法判断当前构造的实例是否被声明为const。以下极简示例可正常编译,且能无阻碍地向const实例inst1写入值555:
#include <forward_list> template <typename TInstance> class ObjList { public: ObjList() { instances().push_front(static_cast<TInstance*>(this)); } // 防止静态初始化顺序问题(SIOF) static std::forward_list<TInstance*>& instances() { static std::forward_list<TInstance*> instances; return instances; } }; class SomeClass : public ObjList<SomeClass> { public: SomeClass(int someData) : someData{someData} {} void write(int data) { someData = data; } private: int someData; }; SomeClass inst0{200}; const SomeClass inst1{400}; int main() { for (SomeClass* instance : ObjList<SomeClass>::instances()) { instance->write(555); } }
有开发者指出这是一种易引发未定义行为的不当用法。
核心问题
- 是否存在修复该const正确性问题的方法?
- 能否推荐其他可参考的设计方案?
- 注:必须使用C++14,无法采用相关示例中的新方案
备选问题(若无法修复)
如果接受用户通过迂回方式修改已声明为const的实例(会提供相关文档说明),此时问题为:
- 如果强制所有实例位于可写内存区域(例如在ObjList中添加mutable成员),是否可继续使用上述方法?这是否仍会导致未定义行为?
内容的提问来源于Stack Exchange,提问作者nowhere_
相关产品推荐
相关产品推荐

