क्रोनो :: माह और क्रोनो :: महीनों के बीच क्या अंतर है


106

C ++ 20 क्रोनो प्रकार / मान month{7}और के बीच क्या अंतर है months{7}? क्या यह दो ऐसे ही नामों के लिए भ्रमित नहीं है?

जवाबों:


130

हाँ, यह भ्रमित हो सकता है दोनों monthऔर monthsजब पहली बार इस पुस्तकालय का सामना कर रहे हों। हालांकि इस भ्रम को कम करने में मदद के लिए इस लाइब्रेरी में लगातार नामकरण परंपराएं हैं। और लाभ छोटे सहज नामों को बनाए रखते हुए अलग-अलग शब्दार्थों का स्पष्ट पृथक्करण है।

months

सभी "पूर्वनिर्धारित" chrono::durationप्रकार बहुवचन हैं:

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

तो monthsएक chrono::durationप्रकार है :

महीने = अवधि का उपयोग करके < हस्ताक्षरित पूर्णांक प्रकार के कम से कम 20 बिट्स ,
                         अनुपात_दिव्यांग <वर्ष :: अवधि, अनुपात <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। यह सिविल कैलेंडर में वर्ष के एक महीने के लिए एक कैलेंडर निर्दिष्ट है । या:

static_assert(month{7} == July);

इसका उपयोग इस तरह की तारीख बनाने के लिए किया जा सकता है:

auto independence_day = month{7}/4d/2020y;

इन अलग-अलग शब्दार्थों का बीजगणित monthऔर monthsप्रतिबिंबित करता है। उदाहरण के लिए "जुलाई + जुलाई" निरर्थक है, और इस तरह एक संकलन-समय त्रुटि:

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

Ie monthऔर monthsकेवल बराबर नहीं हैं, वे भी तुलनीय नहीं हैं। यदि आप फल उपमाओं में हैं तो वे सेब और संतरे हैं। ;-)

वहाँ के बीच समान संबंध है dayऔर days। और के बीच yearऔर years।


यदि यह बहुवचन है, तो यह एक है chrono::duration।


और केवल <chrono>यह सुनिश्चित करने में आपकी मदद करने के लिए टाइप सुरक्षा है कि ये दो अलग-अलग विशिष्ट और फिर भी समान अवधारणाएं आपके कोड में एक दूसरे के साथ भ्रमित न हों।


क्या यह July == July + months(12*x)एक्स की परवाह किए बिना सच होने की गारंटी है ? यहां तक ​​कि x के लिए INT_MAX?
— पियोट्रैनिक्स

3
लगभग। यदि 12*xओवरफ्लो होता है तो आपको वहां अपरिभाषित व्यवहार मिलता है ( monthsनिर्माण से पहले )। हालाँकि, यदि मान months12 (सकारात्मक या नकारात्मक) का गुणक है, तो हाँ जोड़ (या घटाव) अनिवार्य रूप से एक सेशन नहीं है। आपको जैसा मिलेगा वैसा ही मिलेगा July == July + years(x)।
— हावर्ड हिनांत

आपने अपना प्रश्न १ asked:५:58 पूछा और आपने इसका उत्तर १ ?:५:58 में भी दिया?
— डेजोमा

2
केवल अपने ही सवाल का जवाब देना ठीक नहीं है, यह स्पष्ट रूप से प्रोत्साहित किया गया है: stackoverflow.blog/2011/07/01/… , stackoverflow.com/help/self-answer
— हावर्ड हिनान्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.