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