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



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

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

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

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

如果没有{},它实际上也可以工作,但无论如何,显式零初始化它是更好的风格

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

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

之所以可以说第二部分,是因为它是一个事实上的标准,即所有实现都使用C++11/14/17中的system_clock跟踪Unix时间。对于C++20,这个行业实践已经被正式指定。

重要提示:本规范严格适用于基于system_clocktime_point。人们不能对所有的计时time_point秒都假设这个历元。

根据评论推测,您的使用看起来像:

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};

现在没有必要发表评论了。

最新更新