std::chrono 在 std::vector 中无法正常工作

std::chrono is not working properly in std::vector

我写了一个 class,每秒执行一些操作。在这里:

using namespace std::chrono;
class TimerTest
{
public:
    TimerTest()
    {
        m_start = steady_clock::now();
    }
    void update() // is called every iteration of the main loop
    {
        if (duration_cast<seconds>(steady_clock::now() - m_start) >= m_duration)
        {
            m_start = steady_clock::now();
            std::cout << 1; // some action
        }
    }
private:
    time_point<steady_clock> m_start;

    duration<double> m_duration = seconds(1);
};

当它由一个单独的变量定义时它工作正常:

int main()
{
    TimerTest timer_test;
    while (true)
    {
        timer_test.update();
    }
}

每秒“1”打印到控制台。 但是问题出现了,当我把我的 class 放到一个向量中时:

int main()
{
    std::vector<TimerTest> vec;
    vec.push_back(TimerTest());
    
    while (true)
    {
        for (auto i : vec)
        {
            i.update();
        }
    }
}

在向量中,此 if (duration_cast<seconds>(steady_clock::now() - m_start) >= duration) 行出错,自上次 m_start 更新以来经过的时间总是大于 m_duration。因此,循环的每次迭代都会将“1”打印到控制台。 我真的很想知道这种奇怪行为的原因以及如何解决它。也许我对向量一无所知,因为我对 C++ 不是很有经验。 所以,请帮助我理解它。

基本问题是基于范围的 for 循环正在制作 TimerTest 的副本并更新副本而不是原始副本。尝试...

for (auto &i: vec) {
    i.update();
}