সি ++ 20 chrono ধরনের / মান মধ্যে পার্থক্য কি month{7}এবং months{7}? এই জাতীয় দুটি নাম থাকা কি বিভ্রান্তিকর নয়?
সি ++ 20 chrono ধরনের / মান মধ্যে পার্থক্য কি 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')
উদাহরণস্বরূপ monthএবং monthsকেবলমাত্র সমান নয়, তারা তুলনামূলকও নয়। এগুলি আপেল এবং কমলা, যদি আপনি ফলের উপমাতে থাকেন into ;-)
dayএবং এর মধ্যে একই রকম সম্পর্ক রয়েছে days। এবং মধ্যে yearএবং years।
যদি এটি বহুবচন হয় তবে এটি ক
chrono::duration।
এবং <chrono>এই দুটি শব্দার্থগতভাবে স্বতন্ত্র এবং তবুও অনুরূপ ধারণাগুলি আপনার কোডটিতে একে অপরের সাথে বিভ্রান্ত না হয় তা নিশ্চিত করতে আপনাকে কেবল সুরক্ষার ধরণ রয়েছে।
12*xওভারফ্লো হয় তবে আপনি ঠিক সেখানেই নির্ধারিত আচরণ পেয়েছেন ( monthsকনস্ট্রাক্টর রান করার আগে )। তবে মানটি যদি months12 (ধনাত্মক বা negativeণাত্মক) এর একাধিক হয় তবে হ্যাঁ সংযোজন (বা বিয়োগ) মূলত একটি অপ-বিকল্প। আপনি একই জিনিস পেতে হবে July == July + years(x)।
July == July + months(12*x)এক্স নির্বিশেষে এটি সত্য হওয়ার নিশ্চয়তা কি ? এমনকি x INT_MAX হওয়ার জন্য?