chrono::month 和 chrono::month 有什么区别

What is the difference between chrono::month and chrono::months

C++20 chrono types/values month{7}months{7} 有什么区别?有两个如此相似的名字是不是很混乱?

是的,当第一次遇到这个库时,同时拥有 monthmonths 可能会造成混淆。然而,这个库中有一致的命名约定,以帮助减少这种混淆。好处是在保留简短直观的名称的同时明确区分不同的语义。

months

所有"predefined" chrono::duration类型都是复数:

  • nanoseconds
  • microseconds
  • milliseconds
  • seconds
  • minutes
  • hours
  • days
  • weeks
  • months
  • years

所以 monthschrono::duration type:

using months = duration<signed integer type of at least 20 bits,
                         ratio_divide<years::period, ratio<12>>>;

正好是years1/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;

monthmonths的代数反映了这些不同的语义。例如 "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')

monthmonths 不仅不相等,甚至没有可比性。它们是苹果和橙子,如果你喜欢水果类比的话。 ;-)

daydays之间也有类似的关系。在 yearyears 之间。


If it is plural, it is a chrono::duration.


而且只有 <chrono> 具有类型安全性,可帮助您确保这两个语义不同但相似的概念不会在您的代码中相互混淆。