【问题标题】:Why is it not possible to add a `std::chrono::hours` to a `std::chrono::sys_days`为什么不能将 `std::chrono::hours` 添加到 `std::chrono::sys_days`
【发布时间】:2022-01-11 09:33:38
【问题描述】:

使用<chrono> 库迈出第一步, 我从粒度time_point 的基本算术开始。 感谢@HowardHinnant 提供的非常有用的post, 我设法写了this

#include <chrono>
using namespace std::chrono_literals;

int main()
{
    std::chrono::sys_days d {std::chrono::January/31/2022};
    d += std::chrono::days{2}; // ok
    //d += 48h; // error: no match for 'operator+=' with std::chrono::hours
}

我不清楚为什么不允许使用d += 48h;std::chrono::time_point&lt;&gt;::operator+= 采用duration, 并且该表达式中的 rvaluestd::chrono::hours 在我看来代表了一个时间段。 这里的哲学是什么?是否有不同的持续时间类型 根据必须兼容的计量单位 time_point 的粒度?为什么?

另一方面,我明白为什么d += 2d; 会出错, 因为在这种情况下std::literals::chrono_literals::operator""dstd::chrono::day,这不是持续时间(这很方便 形成一个日期文字,虽然看起来有点不一致 大部头书)。 想知道有没有更方便的表达方式 相当于std::chrono::days{2} 的持续时间文字。

【问题讨论】:

  • 因为sys_days 的分辨率是几天而不是几小时,超出此范围的所有内容都会丢失。如果您想要小时粒度,请使用小时,或者更好,只需 std::chrono::time_point
  • @Sahsahae 凭我的聪明才智,我假设48h 的持续时间相当于两天,因为我无法用2d 表达它。我选择了一天的粒度只是为了看看它是如何工作的,但似乎我必须更好地研究这个库背后的基本原理。
  • 一种更方便的方式来表达等同于days{2}的持续时间文字——没有人可以阻止你创建自己的operator""_days
  • @Ranoiaetep 这是我错过的一个好点。
  • 关于持续时间、time_points 和时钟的基础知识,这里有一个 1 小时的视频教程:youtube.com/watch?v=P32hvk8b13M 关于如何在此基础上构建日历和时区的视频:youtube.com/watch?v=adSAN282YIw

标签: c++ literals duration chrono


【解决方案1】:

您可以将小时数添加到天数。您不能做的是再次将其隐式转换为天。 You need a cast

d = std::chrono::time_point_cast<std::chrono::days>(d + 48h);

【讨论】:

  • 所以operator+ 接受hours,结果是time_point(以小时为单位)。我认为d+=48h; 表达了明确的意图,但我现在看到隐式转换可以隐藏令人讨厌的不受欢迎的行为。
  • @MatG 在这种情况下,您将放弃0,但通常这是有损转换
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2017-08-12
  • 2019-07-16
相关资源
最近更新 更多