محدّد noexcept
حدّد الدوال التي لا ترمي استثناءات
محدّد noexcept درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما الذي يصرّح به noexcept؟
يعدّ محدِّد noexcept بأن الدالة لن ترمي استثناءً. وإذا فعلت ذلك رغمًا عن هذا الوعد، يستدعي البرنامج std::terminate.
#include <iostream>
int square(int x) noexcept {
return x * x;
}
int main() {
std::cout << square(5) << "\n";
}لماذا يهم ذلك؟
تتيح معرفة أن الدالة لا يمكنها رمي استثناء للمصرّف والمكتبة إجراء تحسينات — مثل اختيار النقل بدل النسخ أثناء نمو الحاوية.
ينبغي أن تكون عمليات النقل noexcept
لا يستخدم std::vector منشئ النقل الخاص بك عند إعادة التخصيص إلا إذا كان noexcept؛ وإلا فإنه ينسخ حفاظًا على الأمان. لذا ضع وسم noexcept لعمليات النقل.
struct Buffer {
int* p;
Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};المُخرّبات noexcept افتراضيًا
منذ C++11، تكون المُخرّبات ضمنيًا noexcept. ويؤدي السماح بخروج استثناء من إحداها إلى إنهاء البرنامج.
noexcept مشروط
يجعل noexcept(expr) هذا الوعد معتمدًا على قيمة منطقية وقت الترجمة — وهو مفيد في القوالب التي تمرّر ضمان نوع آخر.
template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}الاستعلام باستخدام معامل noexcept
يُرجع noexcept(expr) عند استخدامه كمعامل القيمة true إذا أُعلن أن التعبير لا يرمي استثناءً — وهذا مفيد في القوالب.
#include <iostream>
int f() noexcept { return 1; }
int g() { return 2; }
int main() {
std::cout << noexcept(f()) << " " << noexcept(g()) << "\n"; // 1 0
}يُعد noexcept جزءًا من النوع
منذ C++17، يُعد noexcept جزءًا من نوع مؤشر الدالة، ولذلك لا يمكن ربط دالة قابلة للرمي بمؤشر noexcept.
لا تقدّم وعودًا مبالغًا فيها
ضع وسم noexcept للدالة فقط إذا كنت متأكدًا من أنها لا يمكن أن ترمي استثناءً. فوعد زائف يُنتهك يؤدي إلى انهيار البرنامج بأكمله.
مرشحات مناسبة
تُعد عمليات التبديل والنقل والمُخرّبات ودوال الوصول البسيطة والمساعدات الحسابية دوال noexcept طبيعية.
noexcept مقابل throw()
إن مواصفة throw() الديناميكية القديمة مهجورة وقد أُزيلت. استخدم noexcept بدلًا منها في C++ الحديثة.
الأداء والأمان
يوثّق noexcept النية ويمكّن في الوقت نفسه تحسينات مثل النقل عند إعادة التخصيص — فهو تعليق صغير ذو أثر حقيقي.
تحقق سريع
اختبر فهمك لـ noexcept.
مراجعة
تعلّمت أن محدِّد noexcept يعدم برمي أي استثناءات، ما يتيح تحسينات مثل النقل عند إعادة التخصيص. ضع وسم noexcept لعمليات النقل والتبديل والمُخرّبات، واستخدم الصيغ المشروطة في القوالب، ولا تقدّم وعودًا مبالغًا فيها.
الأسئلة الشائعة
هل درس «محدّد noexcept» مجاني؟
نعم — نص درس «محدّد noexcept» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «محدّد noexcept»؟
حدّد الدوال التي لا ترمي استثناءات تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «محدّد noexcept»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.