C ++ 20クロノタイプ/値month{7}
との違いは何months{7}
ですか?そのような似たような名前が2つあるのは混乱しませんか?
回答:
はい、両方を持っていることmonth
とmonths
、このライブラリに最初に遭遇したときは混乱する可能性があります。ただし、このライブラリには、その混乱を減らすのに役立つ一貫した命名規則があります。また、直感的な短い名前を保持しながら、異なるセマンティクスを明確に分離できるという利点があります。
months
すべての「事前定義」chrono::duration
タイプは複数形です。
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
days
weeks
months
years
だから、months
あるchrono::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
これは、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;
これらの異なるセマンティクスの代数と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
。
複数形の場合は
chrono::duration
。
そして<chrono>
、これら2つの意味的に異なるが類似した概念がコード内で互いに混同されないようにするのに役立つ、型安全性のみがあります。
12*x
あなたが(前右が未定義の動作を持っているオーバーフローmonths
コンストラクタが実行されます)。ただし、の値がmonths
12の倍数(正または負)の場合、はい、加算(または減算)は基本的にノーオペレーションです。と同じものが得られJuly == July + years(x)
ます。
July == July + months(12*x)
xに関係なく真であることが保証されています か?xがINT_MAXであっても?