ব্যতিক্রম স্পেসিফায়ারদের অবহেলা করা হয়েছিল কারণ ব্যতিক্রম স্পেসিফায়াররা সাধারণত একটি ভয়ঙ্কর ধারণা । 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। এছাড়াও এই ক্ষেত্রে কিছুটা ভিন্ন স্ট্যাক অযৌক্তিক আচরণ।