C ++ 20 krono türleri / değerleri arasındaki fark nedir month{7}
ve months{7}
? Bu kadar benzer iki isme sahip olmak kafa karıştırıcı değil mi?
C ++ 20 krono türleri / değerleri arasındaki fark nedir month{7}
ve months{7}
? Bu kadar benzer iki isme sahip olmak kafa karıştırıcı değil mi?
Yanıtlar:
Evet, her ikisine de sahip olmak month
ve months
bu kitaplıkla ilk karşılaştığınızda kafa karıştırıcı olabilir . Ancak, bu karışıklığı azaltmaya yardımcı olmak için bu kitaplıkta tutarlı adlandırma kuralları vardır. Bunun faydası, kısa sezgisel isimleri korurken farklı anlambilimlerin net bir şekilde ayrılmasıdır.
months
Tüm "önceden tanımlanmış" chrono::duration
türler çoğuldur:
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
days
weeks
months
years
Yani months
bir olduğunu chrono::duration
tipi :
ay kullanımı = süre < en az 20 bitlik işaretli tam sayı türü , oran_bölme <yıl :: dönem, oran <12> >>;
Ve bu tam olarak 1 / 12 arasında years
.
static_assert(12*months{1} == years{1});
Bunu şu şekilde yazdırabilirsiniz:
cout << months{7} << '\n';
Ve çıktı:
7[2629746]s
Bu, 2,629,746'lık 7 birim olarak okur. Medeni takvimde ayın ortalama uzunluğu 2.629.746 saniyedir. Farklı şekilde belirtilmiştir:
static_assert(months{1} == 2'629'746s);
(kesin sayı, kazanan bar bahisleri dışında özellikle önemli değildir)
month
month
Öte yandan (tekil) olduğu değil bir chrono::duration
. Bu bir olan takvimsel belirteci sivil takvimde yılın bir ay. Veya:
static_assert(month{7} == July);
Bu, şöyle bir tarih oluşturmak için kullanılabilir:
auto independence_day = month{7}/4d/2020y;
Bu farklı anlambilimin cebiri month
ve months
yansıtır. Örneğin "Temmuz + Temmuz" anlamsızdır ve bu nedenle bir derleme zamanı hatasıdır:
auto x = month{7} + month{7};
~~~~~~~~ ^ ~~~~~~~~
error: invalid operands to binary expression ('std::chrono::month' and 'std::chrono::month')
Ama bu çok mantıklı:
auto constexpr x = month{7} + months{7};
static_assert(x == February);
Ve bu:
auto constexpr x = months{7} + months{7};
static_assert(x == months{14});
Ve henüz:
auto b = February == months{14};
~~~~~~~~ ^ ~~~~~~~~~~
error: invalid operands to binary expression ('const std::chrono::month' and 'std::chrono::months')
Yani month
ve months
sadece vardır-eşit değildir, hatta karşılaştırılabilir değildir. Meyve benzetmeleriyle ilgileniyorsanız bunlar elma ve portakaldır. ;-)
day
Ve arasında benzer bir ilişki var days
. Ve arasında year
ve years
.
Çoğulsa, bir
chrono::duration
.
Ve sadece <chrono>
bu iki anlamsal olarak farklı ve yine de benzer kavramların kodunuzda birbiriyle karıştırılmamasını sağlamanıza yardımcı olacak tür güvenliğine sahiptir.
12*x
Taşma durumunda, tam orada tanımsız davranışınız olur ( months
yapıcı çalıştırılmadan önce ). Bununla birlikte, değeri months
12'nin katı ise (pozitif veya negatif), o zaman evet toplama (veya çıkarma) esasen işlemsizdir. Aynı şeyi alırsın July == July + years(x)
.
July == July + months(12*x)
bağımsız olarak doğru olması garantili mi? X'in INT_MAX olması için bile mi?