ব্যতিক্রম স্পেসিফায়ারদের অবহেলা করা হয়েছিল কারণ ব্যতিক্রম স্পেসিফায়াররা সাধারণত একটি ভয়ঙ্কর ধারণা । noexcept
যুক্ত করা হয়েছিল কারণ এটি ব্যতিক্রম নির্দিষ্টকরণকারীর একটাই যুক্তিসঙ্গতভাবে কার্যকর ব্যবহার: কোন ফাংশন কখন ব্যতিক্রম ছুঁড়ে না তা জেনে । সুতরাং এটি একটি বাইনারি পছন্দ হয়ে ওঠে: ফাংশন যা নিক্ষেপ করবে এবং ফাংশনগুলি যা নিক্ষেপ করবে না।
noexcept
আরও শক্তিশালী throw()
বলে বাদে কেবলমাত্র সমস্ত থ্রো স্পেসিফায়ার অপসারণের পরিবর্তে যুক্ত করা হয়েছিল noexcept
। noexcept
একটি প্যারামিটার থাকতে পারে যা সংকলন-সময়টি বুলিয়ানকে সমাধান করে। বুলিয়ান যদি সত্য হয়, তবে noexcept
লাঠিগুলি। বুলিয়ানটি যদি মিথ্যা হয়, তবে noexcept
লাঠিটি আটকে না এবং ফাংশনটি ছুঁড়ে দিতে পারে।
সুতরাং, আপনি এর মতো কিছু করতে পারেন:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
কি CreateOtherClass
থ্রো ব্যতিক্রম? এটি হতে পারে, যদি T
এর ডিফল্ট কনস্ট্রাক্টর পারেন। আমরা কীভাবে বলব? এটার মত:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
সুতরাং, CreateOtherClass()
প্রদত্ত প্রকারের ডিফল্ট কনস্ট্রাক্টর ছুড়ে ফেললে if ছুঁড়ে ফেলবে। এটি ব্যতিক্রম স্পেসিফায়ারগুলির সাথে একটি বড় সমস্যা সমাধান করে: কল স্ট্যাকের প্রচারে তাদের অক্ষমতা।
আপনি এটি দিয়ে এটি করতে পারবেন না throw()
।
noexcept
রানটাইম চেক বহন করতে হতে পারে। তাদের মধ্যে প্রধান পার্থক্য হ'ল ব্রেকিংnoexcept
কারণগুলিstd::terminate
ভাঙ্গারthrow
কারণগুলিstd::unexpected
। এছাড়াও এই ক্ষেত্রে কিছুটা ভিন্ন স্ট্যাক অযৌক্তিক আচরণ।