تخطَّ إلى المحتوى

if consteval

if consteval: تمييز التنفيذ وقت الترجمة if consteval

if consteval من C++23 يفحص هل الكود يُنفَّذ حاليًا وقت الترجمة، ببديل أوضح وأقوى من std::is_constant_evaluated().

قبل C++23، دالة constexpr تحتاج لتفرّع سلوكها بين وقت الترجمة ووقت التشغيل تستخدم std::is_constant_evaluated() من <type_traits> داخل if عادي — وله قيد مهم: لا يمكن استدعاء دالة consteval من داخل ذلك الشرط لأن المعاملات نفسها لا تُعتبر تعبيرات ثابتة. if consteval يحل هذا القيد بصياغة مخصّصة لا تحتاج تضمين إضافي، وتسمح باستدعاء دوال consteval داخل فرعها.

if consteval {...} else {...} يعمل مثل if عادي لكن شرطه ليس تعبيرًا تكتبه أنت — المترجم نفسه يقرّر أي فرع يُنفَّذ حسب سياق الاستدعاء (وقت ترجمة أم وقت تشغيل).

الصياغة

constexpr ReturnType func(...) {
    if consteval {
        // ينفَّذ فقط وقت الترجمة
    } else {
        // ينفَّذ وقت التشغيل
    }
}

📄 مثال

#include <type_traits>

constexpr double approx(double x) {
    if consteval {
        return x * x;               // وقت الترجمة
    } else {
        return x * x + 0.0000001;   // وقت التشغيل
    }
}

أهم النقاط

العنصرالوظيفة
if constevalالفرع الأول ينفَّذ فقط لو الاستدعاء يحدث وقت الترجمة
elseالفرع الثاني ينفَّذ وقت التشغيل الحقيقي فقط
استدعاء constevalيمكن استدعاء دوال consteval داخل فرع if consteval، بعكس is_constant_evaluated()

💡 نصائح عملية

  • فضّله على std::is_constant_evaluated() بكود C++23 جديد — أوضح وبلا تضمين header إضافي
  • يفيد بدوال تحتاج مسارًا مختلفًا للأداء وقت التشغيل عن الدقّة الكاملة وقت الترجمة

⚠️ أخطاء شائعة

  • الظن أن شرط if consteval تعبير تكتبه أنت — هو كلمة مفتاحية ثابتة، المترجم يقرّر أي فرع ينفَّذ
  • استخدامه بمترجم لا يدعم C++23 كاملًا دون التحقق من الدعم أولًا

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.