Chrono :: month ve chrono :: months arasındaki fark nedir


105

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:


129

Evet, her ikisine de sahip olmak monthve monthsbu 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::durationtürler çoğuldur:

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

Yani monthsbir olduğunu chrono::durationtipi :

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 monthve monthsyansı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 monthve monthssadece vardır-eşit değildir, hatta karşılaştırılabilir değildir. Meyve benzetmeleriyle ilgileniyorsanız bunlar elma ve portakaldır. ;-)

dayVe arasında benzer bir ilişki var days. Ve arasında yearve 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.


X'den July == July + months(12*x)bağımsız olarak doğru olması garantili mi? X'in INT_MAX olması için bile mi?
PiotrNycz

3
Neredeyse. 12*xTaşma durumunda, tam orada tanımsız davranışınız olur ( monthsyapıcı çalıştırılmadan önce ). Bununla birlikte, değeri months12'nin katı ise (pozitif veya negatif), o zaman evet toplama (veya çıkarma) esasen işlemsizdir. Aynı şeyi alırsın July == July + years(x).
Howard Hinnant

17:58 sorunuzu sordunuz ve 17:58 de mi cevapladınız?
dejoma

2
Sadece kendi sorunuzu yanıtlamakla kalmaz, açıkça teşvik edilir: stackoverflow.blog/2011/07/01/… , stackoverflow.com/help/self-answer
Howard Hinnant
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.