如何重赋值类成员chrono::time_point?解决const引发的编译错误
解决const成员函数中修改chrono::time_point的编译错误
核心问题分析
你遇到的编译错误本质是:const成员函数不允许修改非mutable的类成员变量。trackTime()被标记为const,但函数内尝试更新m_timestamp——这个操作会修改对象的内部状态,违反了const函数的语义承诺,因此编译器报错。
可行解决方案
方案1:移除函数的const修饰符(推荐)
既然trackTime()的功能就是更新时间戳、追踪时间流逝,它本身就会修改对象状态,完全没有必要声明为const。直接去掉const关键字即可解决问题:
#include <iostream> #include <chrono> #include <cstdint> namespace chrono = std::chrono; namespace chrono_lit = std::chrono_literals; using namespace chrono_lit; class TrackTimeElapsed { public: TrackTimeElapsed(uint64_t interval): m_timestamp(chrono::steady_clock::now()), m_interval(interval) {} ~TrackTimeElapsed() {} void trackTime() { // 移除const修饰符 chrono::time_point<chrono::steady_clock> now = chrono::steady_clock::now(); auto diff = chrono::duration_cast<std::chrono::seconds>(now - m_timestamp); if (diff.count() > m_interval) { std::cout << "Time elapsed" << std::endl; m_timestamp = now; // 现在可以正常赋值 } } private: chrono::time_point<chrono::steady_clock> m_timestamp; uint64_t m_interval; };
方案2:将m_timestamp声明为mutable(仅当必须保留const时使用)
如果因为某些场景限制,必须让trackTime()保持const(比如需要在const对象上调用该函数),可以将m_timestamp标记为mutable——这个关键字允许成员变量在const成员函数中被修改:
#include <iostream> #include <chrono> #include <cstdint> namespace chrono = std::chrono; namespace chrono_lit = std::chrono_literals; using namespace chrono_lit; class TrackTimeElapsed { public: TrackTimeElapsed(uint64_t interval): m_timestamp(chrono::steady_clock::now()), m_interval(interval) {} ~TrackTimeElapsed() {} void trackTime() const { // 保留const修饰符 chrono::time_point<chrono::steady_clock> now = chrono::steady_clock::now(); auto diff = chrono::duration_cast<std::chrono::seconds>(now - m_timestamp); if (diff.count() > m_interval) { std::cout << "Time elapsed" << std::endl; m_timestamp = now; // mutable成员允许在const函数中修改 } } private: mutable chrono::time_point<chrono::steady_clock> m_timestamp; // 添加mutable uint64_t m_interval; };
方案选择建议
- 优先选方案1:这是最符合C++语义的做法,因为
trackTime()的行为就是修改对象状态,const修饰符在这里属于误用。 - 方案2仅作为特殊场景的妥协:比如当你需要在const引用或const对象上调用该函数时才使用,不要滥用mutable,否则会破坏const的语义一致性。
内容的提问来源于stack exchange,提问作者Kenneth Cornett
相关产品推荐
相关产品推荐

