You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保留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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:59:56