1. ホーム
  2. c++

[解決済み] chrono::monthとchrono::monthsの違いは何ですか?

2022-11-17 11:17:46

質問

C++20のクロノタイプ/値の違いは何ですか? month{7}months{7} ? こんな似たような名前が2つもあると、混乱しませんか?

どのように解決するのですか?

そうです。 monthmonths といった具合に、このライブラリに初めて接したとき しかし、このライブラリには一貫した命名規則があり、そのような混乱を軽減するのに役立っています。 そして、短い直感的な名前を維持しながら、異なるセマンティクスの明確な分離を持つという利点があります。

months

すべて"predefined"です。 chrono::duration のタイプはすべて複数形です。

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

だから months chrono::duration タイプ :

months = duration< を使っています。

少なくとも20ビットの符号付き整数型

,
                         ratio_divide<years::period, ratio<12>>> を使用します。

そして、それはまさに 1 / 12 years .

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 (単数形) 一方は ではない a 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 .


複数形であれば chrono::duration .


そして、唯一 <chrono> だけが型安全性を持っており、意味的に異なるが類似したこの 2 つの概念がコード内で互いに混同されないようにするのに役立ちます。