用零初始化 std::chrono::time_point 变量

问题描述 投票:0回答:2

我有一个名为last_timestamp_的变量,其声明如下:

using TimePoint = std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<double>> TimePoint last_timestamp_

我想用零初始化它,我该怎么做?谢谢

c++ std
2个回答
2
投票
using TimePoint = std::chrono::time_point<std::chrono::system_clock, 
    std::chrono::duration<double>>;
TimePoint last_timestamp_{};

它实际上也可以在没有

{}
的情况下工作,但恕我直言,显式地将其零初始化是更好的风格。

您可以通过两种方式阅读:

  1. 它在内部将
    last_timestamp_
    的值设置为
    0.0s
    或其纪元。
  2. 它将
    last_timestamp_
    设置为 1970-01-01 00:00:00 UTC。

您可以说第二部分的原因是因为它是事实上的标准,所有实现都在 C++11/14/17 中使用 system_clock 跟踪

Unix Time
。对于 C++20,此行业惯例已正式指定

重要提示: 本规范严格适用于基于

time_point
system_clock
。人们无法为所有 chrono
time_point
s 假设这个纪元。

从评论中推测您的使用情况如下:

while (...)
{
    if (std::chrono::system_clock::now() > last_timestamp_ + threshold)
    {
        // now() - last_timestamp_ > threshold
        ...
        last_timestamp_ = std::chrono::system_clock::now();
    }
};

假设

threshold
不超过 51 年,您的第一次迭代将是正确的。

为了让你的代码面向未来,值得评论:

TimePoint last_timestamp_{};  // 1970-01-01

现在,如果您出于任何原因更改时钟,您知道您可能必须重新访问此初始值。例如,在某些平台上,

file_clock
的纪元将在遥远的未来,如果切换到
file_clock
,则会破坏此代码。 C++20 提供了使初始化更加明确的语法:

using namespace std::chrono_literals;
TimePoint last_timestamp_ = std::chrono::sys_days{1970y/1/1};

现在评论已经没有必要了。


0
投票

方法 std::chrono::time_point::min() 表示最小可能值,即您正在寻找的“零”。

std::chrono::time_point my_time = std::chrono::time_point::min();
© www.soinside.com 2019 - 2024. All rights reserved.