C++ chrono::month和chrono::months之间有什么区别
C++20计时类型/值C++ chrono::month和chrono::months之间有什么区别,c++,c++20,chrono,C++,C++20,Chrono,C++20计时类型/值month{7}和month{7}之间有什么区别?有两个这样相似的名字不是很容易混淆吗?是的,当第一次遇到这个库时,同时有month和month可能会混淆。然而,这个库中有一致的命名约定来帮助减少这种混淆。这样做的好处是在保留简短直观名称的同时,清晰地分离不同的语义 月份 所有“预定义的”chrono::duration类型都是复数: 纳秒 微秒 毫秒 秒 分钟数 hours 天数 weeks 月份 年份 因此,months是一个: 您可以这样打印出来: cout &l
month{7}
和month{7}
之间有什么区别?有两个这样相似的名字不是很容易混淆吗?是的,当第一次遇到这个库时,同时有month
和month
可能会混淆。然而,这个库中有一致的命名约定来帮助减少这种混淆。这样做的好处是在保留简短直观名称的同时,清晰地分离不同的语义
月份
所有“预定义的”chrono::duration
类型都是复数:
纳秒
微秒
毫秒
秒
分钟数
hours
天数
weeks
月份
年份
months
是一个:
您可以这样打印出来:
cout << months{7} << '\n';
auto independence_day = month{7}/4d/2020y;
其读数为2629746s的7个单位。事实证明,2629746秒是公历中一个月的平均长度。换言之:
static_assert(months{1} == 2'629'746s);
(除了赢得酒吧赌注外,准确的数字并不特别重要)
月份
另一方面,month
(单数)不是chrono::duration
。它是民用日历中一年中一个月的历法说明符。或:
static_assert(month{7} == July);
这可用于形成如下日期:
cout << months{7} << '\n';
auto independence_day = month{7}/4d/2020y;
month
和month
的代数反映了这些不同的语义。例如,“July+July”是无意义的,因此是编译时错误:
auto x = month{7} + month{7};
~~~~~~~~ ^ ~~~~~~~~
error: invalid operands to binary expression ('std::chrono::month' and 'std::chrono::month')
但这很有道理:
auto constexpr x = month{7} + months{7};
static_assert(x == February);
这是:
auto constexpr x = months{7} + months{7};
static_assert(x == months{14});
然而:
auto b = February == months{14};
~~~~~~~~ ^ ~~~~~~~~~~
error: invalid operands to binary expression ('const std::chrono::month' and 'std::chrono::months')
也就是说,月
和月
不仅不相等,甚至不可比较。如果你喜欢水果类比的话,它们是苹果和桔子
天
和天
之间存在类似的关系。在年
和年
之间
static_assert(12*months{1} == years{1});
如果它是复数,则它是一个
chrono::duration
只有
具有类型安全性,可以帮助您确保这两个语义不同但相似的概念不会在代码中相互混淆。无论x是多少,它是否保证为真July==July+months(12*x)
?即使x是INT_MAX?几乎。如果12*x
溢出,您就有了未定义的行为(在months
构造函数运行之前)。但是,如果months
的值是12的倍数(正数或负数),那么加法(或减法)本质上是不可操作的。你会得到与July==July+years(x)
相同的结果。你在17:58问了你的问题,你也在17:58回答了它?回答你自己的问题不仅可以,明确鼓励:,