chrono :: monthとchrono :: monthsの違いは何ですか


106

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

回答:


130

はい、両方を持っていることmonthmonths、このライブラリに最初に遭遇したときは混乱する可能性があります。ただし、このライブラリには、その混乱を減らすのに役立つ一貫した命名規則があります。また、直感的な短い名前を保持しながら、異なるセマンティクスを明確に分離できるという利点があります。

months

すべての「事前定義」chrono::durationタイプは複数形です。

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

だから、monthsあるchrono::durationタイプは

使用月=期間<少なくとも20ビットの符号付き整数型、
                         ratio_divide <years :: period、ratio <12 >>>;

そして、それは正確である1 / 12years

static_assert(12*months{1} == years{1});

次のように印刷できます。

cout << months{7} << '\n';

そして、出力は次のとおりです。

7[2629746]s

これは、2,629,746の7ユニットとして読み取られます。2,629,746秒は、市民カレンダーの月の平均の長さであることがわかります。別の言い方をすると:

static_assert(months{1} == 2'629'746s);

(正確な数は、バーベットに勝つことを除いて特に重要ではありません)

month

month一方、(単数形)はありませんchrono::duration。これは、市民カレンダーの1か月のカレンダー指定子です。または:

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')

つまりmonth、とmonthsは等しくないだけでなく、比較することさえできません。あなたが果物の例えに興味があるなら、それらはリンゴとオレンジです。;-)

との間にも同様の関係がdayありdaysます。そして、の間yearyears


複数形の場合はchrono::duration


そして<chrono>、これら2つの意味的に異なるが類似した概念がコード内で互いに混同されないようにするのに役立つ、型安全性のみがあります。


July == July + months(12*x)xに関係なく真であることが保証されています か?xがINT_MAXであっても?
PiotrNycz

3
ほとんど。もし12*xあなたが(前右が未定義の動作を持っているオーバーフローmonthsコンストラクタが実行されます)。ただし、の値がmonths12の倍数(正または負)の場合、はい、加算(または減算)は基本的にノーオペレーションです。と同じものが得られJuly == July + years(x)ます。
ハワードヒナント

あなたは17:58に質問をし、17:58にも答えますか?
dejoma

2
それは、それが明示的に奨励され、あなた自身の質問に答えるだけでなく大丈夫だ:stackoverflow.blog/2011/07/01/...stackoverflow.com/help/self-answer
ハワードヒナント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.