C ++ 20 क्रोनो प्रकार / मान month{7}और के बीच क्या अंतर है months{7}? क्या यह दो ऐसे ही नामों के लिए भ्रमित नहीं है?
C ++ 20 क्रोनो प्रकार / मान month{7}और के बीच क्या अंतर है months{7}? क्या यह दो ऐसे ही नामों के लिए भ्रमित नहीं है?
जवाबों:
हाँ, यह भ्रमित हो सकता है दोनों monthऔर monthsजब पहली बार इस पुस्तकालय का सामना कर रहे हों। हालांकि इस भ्रम को कम करने में मदद के लिए इस लाइब्रेरी में लगातार नामकरण परंपराएं हैं। और लाभ छोटे सहज नामों को बनाए रखते हुए अलग-अलग शब्दार्थों का स्पष्ट पृथक्करण है।
monthsसभी "पूर्वनिर्धारित" chrono::durationप्रकार बहुवचन हैं:
nanosecondsmicrosecondsmillisecondssecondsminuteshoursdaysweeksmonthsyearsतो 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);
(बार दांव जीतने के अलावा सटीक संख्या विशेष रूप से महत्वपूर्ण नहीं है)
monthmonth(एकवचन) दूसरी ओर नहीं है 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>यह सुनिश्चित करने में आपकी मदद करने के लिए टाइप सुरक्षा है कि ये दो अलग-अलग विशिष्ट और फिर भी समान अवधारणाएं आपके कोड में एक दूसरे के साथ भ्रमित न हों।
12*xओवरफ्लो होता है तो आपको वहां अपरिभाषित व्यवहार मिलता है ( monthsनिर्माण से पहले )। हालाँकि, यदि मान months12 (सकारात्मक या नकारात्मक) का गुणक है, तो हाँ जोड़ (या घटाव) अनिवार्य रूप से एक सेशन नहीं है। आपको जैसा मिलेगा वैसा ही मिलेगा July == July + years(x)।
July == July + months(12*x)एक्स की परवाह किए बिना सच होने की गारंटी है ? यहां तक कि x के लिए INT_MAX?