chrono::month 和 chrono::month 有什么区别
What is the difference between chrono::month and chrono::months
C++20 chrono types/values month{7}
和 months{7}
有什么区别?有两个如此相似的名字是不是很混乱?
是的,当第一次遇到这个库时,同时拥有 month
和 months
可能会造成混淆。然而,这个库中有一致的命名约定,以帮助减少这种混淆。好处是在保留简短直观的名称的同时明确区分不同的语义。
months
所有"predefined" chrono::duration
类型都是复数:
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
days
weeks
months
years
所以 months
是 chrono::duration
type:
using months = duration<signed integer type of at least 20 bits,
ratio_divide<years::period, ratio<12>>>;
正好是years
的1/12。
static_assert(12*months{1} == years{1});
你可以这样打印出来:
cout << months{7} << '\n';
输出为:
7[2629746]s
这读作 7 个单位,每单位 2,629,746 秒。原来,2,629,746 秒是民用历月的平均长度。换句话说:
static_assert(months{1} == 2'629'746s);
(除了赢得酒吧投注外,确切的数字不是特别重要)
month
另一方面,month
(单数)是 而不是 chrono::duration
。它是一个 日历说明符,表示民历中一年中的一个月。或者:
static_assert(month{7} == July);
这可以用来形成这样的日期:
auto independence_day = month{7}/4d/2020y;
month
和months
的代数反映了这些不同的语义。例如 "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')
即month
和 months
不仅不相等,甚至没有可比性。它们是苹果和橙子,如果你喜欢水果类比的话。 ;-)
day
和days
之间也有类似的关系。在 year
和 years
之间。
If it is plural, it is a chrono::duration
.
而且只有 <chrono>
具有类型安全性,可帮助您确保这两个语义不同但相似的概念不会在您的代码中相互混淆。
C++20 chrono types/values month{7}
和 months{7}
有什么区别?有两个如此相似的名字是不是很混乱?
是的,当第一次遇到这个库时,同时拥有 month
和 months
可能会造成混淆。然而,这个库中有一致的命名约定,以帮助减少这种混淆。好处是在保留简短直观的名称的同时明确区分不同的语义。
months
所有"predefined" chrono::duration
类型都是复数:
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
days
weeks
months
years
所以 months
是 chrono::duration
type:
using months = duration<signed integer type of at least 20 bits, ratio_divide<years::period, ratio<12>>>;
正好是years
的1/12。
static_assert(12*months{1} == years{1});
你可以这样打印出来:
cout << months{7} << '\n';
输出为:
7[2629746]s
这读作 7 个单位,每单位 2,629,746 秒。原来,2,629,746 秒是民用历月的平均长度。换句话说:
static_assert(months{1} == 2'629'746s);
(除了赢得酒吧投注外,确切的数字不是特别重要)
month
另一方面,month
(单数)是 而不是 chrono::duration
。它是一个 日历说明符,表示民历中一年中的一个月。或者:
static_assert(month{7} == July);
这可以用来形成这样的日期:
auto independence_day = month{7}/4d/2020y;
month
和months
的代数反映了这些不同的语义。例如 "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')
即month
和 months
不仅不相等,甚至没有可比性。它们是苹果和橙子,如果你喜欢水果类比的话。 ;-)
day
和days
之间也有类似的关系。在 year
和 years
之间。
If it is plural, it is a
chrono::duration
.
而且只有 <chrono>
具有类型安全性,可帮助您确保这两个语义不同但相似的概念不会在您的代码中相互混淆。