constexpr
constexpr هي كلمة مفتاحية مُحدِّدة في لغتي البرمجة C و C++ ، تُشير، باختصار، إلى إمكانية تقييم شيء ما في وقت الترجمة . [ 1 ] على عكس الكلمة المفتاحية العاديةconst، التي تُشير إلى إمكانية الوصول للقراءة فقط،constexprفإن constexpr هي صيغة أقوى تُشير ضمنيًاconst(في معظم السياقات). بينما يقتصر استخدامها في لغة C على الكائنات فقط، [ 2 ]constexpr يُمكن استخدامها مع الكائنات أو الدوال أو الروابط المُهيكلة في لغة C++. [ 1 ]
constتتضمن الكلمات الرئيسية الإضافية في عائلة الكلمات الرئيسية " " في لغة C++ consteval[ 3 ] ، المستخدمة لضمان تنفيذ الدالة في وقت الترجمة ووقت الترجمة فقط، و constinit، المستخدمة لضمان مدة التخزين الثابتة / الخاصة بالخيوط، مما يضمن التهيئة في وقت الترجمة (ولكن ليس عدم قابلية التغيير) [ 4 ] .
خلفية
الكلمة constexprهي كلمة مركبة من كلمتي " constant expression" [ 5 ] ، وقد ظهرت لأول مرة في لغة C++11 . قبل ظهورها constexpr، كانت خيارات تحديد الثوابت والدوال في وقت الترجمة في لغة C++ محدودةً بوحدات الماكرو الخاصة بالمعالج المسبق (مثل #define PI 3.1415926535`constant expression` أو وحدات الماكرو الإجرائية مثل `constant expression` #define SQUARE(x) ((x) * (x)))، والتي كانت تُجري استبدالًا نصيًا، وبالتالي تفتقر إلى أمان النوع الذي توفره ميزة أساسية في اللغة، أو بتعريف ثابت مُعدّد (مثل `constant` )، والذي كان يقتصر على الأنواع الصحيحة فقط. كان أحد الدوافع الرئيسية لتطوير تعبيرات وقت الترجمة هو أن `constant expression` ، على الرغم من كونها مكافئة لوحدة الماكرو `constant expression`، إلا أنها تُنتج تعبيرًا غير ثابت. [ 6 ]enum{WINDOW_SIZE=600};std::numeric_limits<T>::max()INT_MAX
طُرحت المقترحات الأولية لتعميم التعبيرات الثابتة والتعبيرات التي تُنفذ أثناء الترجمة في لغة C++ لأول مرة من قِبل غابرييل دوس ريس عام 2003 [ 7 ] ، حيث اقترح تعميم التعبيرات الثابتة لتشمل الدوال ذات القيم الثابتة ، وهي دوال يمكن تقييمها أثناء الترجمة، بهدف تحسين سلامة الأنواع وقابلية النقل. [ 6 ] نُقّح هذا المقترح لاحقًا بمشاركة بيارن ستروستروب وجينس ماورر عام 2006 لإدخال الكلمة constexprالمفتاحية، بالإضافة إلى تضمين القيم الحرفية المُعرّفة من قِبل المستخدم (كائنات من أنواع مُعرّفة من قِبل المستخدم مع constexprدوال إنشاء وتدمير) في تعريف التعبيرات الثابتة. [ 6 ] ، وتم اعتماده في مسودة C++11 في يوليو 2007. [ 8 ] وصف هيرب سوتر ، رئيس لجنة C++، اعتماد هذه الكلمة عام 2006 constexprبأنه أحد أهم القرارات في تاريخ C++. [ 9 ]
أضافت لغة C++20const كلمتين مفتاحيتين من عائلة "الكلمات المفتاحية": constevalو constinit. [ 10 ] [ 11 ] ومع إدخال خاصية الانعكاس في وقت الترجمة في C++26، تم اقتراح إضافة constevalمتغيرات، ولكن لم يتم إضافتها. [ 12 ]
constexprتم إدخالها لاحقًا في لغة C، بدءًا من C23 . [ 2 ] [ 13 ]
علم الدلالة
يتمثل الاستخدام الأساسي في constexprالسماح بتقييم العمليات الحسابية المعقدة في وقت الترجمة، وتجنب النفقات العامة لوقت التشغيل مثل إطارات المكدس الإضافية أو الذاكرة [ 5 ] دون الاعتماد على توجيهات المعالج المسبق، بالإضافة إلى منع حالات معينة من السلوك غير المحدد . [ 14 ]
المتغيرات
يمكن تعريف متغير أو قالب متغير إذا كان تعريفًا، ونوعًا حرفيًا، ويتم تهيئته عند التعريف، وقابلًا للتهيئة باستخدام تعبير ثابت. [ 15 ] يتم إنشاء هذا المتغير ضمنيًا . كما يمكن إنشاء مراجع بشرط تهيئتها بتعبير ثابت، وأن تكون أي تحويلات ضمنية يتم استدعاؤها أثناء التهيئة تعبيرات ثابتة أيضًا . [ 5 ]constexprconstexprconstconstexpr
استيراد std ؛باستخدام std :: array ;// تعريف الثوابت في وقت الترجمة constexpr double EARTH_GRAVITATIONAL_ACCELERATION = 9.8 ; constexpr double MOON_GRAVITATIONAL_ACCELERATION = EARTH_GRAVITATIONAL_ACCELERATION / 6.0 ; constexpr size_t MAX_LENGTH = 500 ;// ينشئ مصفوفة من الأعداد الصحيحة بطول 500، باستخدام ثابت وقت الترجمة MAX_LENGTH array < int , MAX_LENGTH > numbers ;سمحت لغة C++26 constexprبالربط الهيكلي [ 16 ] ، والذي يمكن ربطه بأنواع التجميع (أي الهياكل )، والمصفوفات ، والأزواج/الصفوف . [ 17 ]
struct Point { int x ; int y ; };constexpr int NUMS [ 3 ] = { 1 , 2 , 3 };// a = 1, b = 5 constexpr auto [ a , b ] = Point {. x = 1 , . y = 5 }; // id = 3, name = "John Doe", score = 95 constexpr auto [ id , name , score ] = std :: make_tuple ( 3 , "John Doe" , 95 ); // x = 1, y = 2, z = 3 constexpr auto [ x , y , z ] = NUMS ;إرشادات ومراجع
في لغة C، لا يجوز أن تكون المؤشرات (باستثناء nullptr)، والأنواع المعدلة بشكل متغير، والأنواع الذرية ، والأنواع الأخرى .volatileconstexpr
في لغة C++، تخضع constexprالمؤشرات والمراجعconstexpr لقيود مختلفة قليلاً عن المتغيرات العادية. ففي constexprالمؤشرات، يجب أن يكون عنوان المؤشر عنوان متغير ذي مدة تخزين ثابتة ، وهو مؤشر ثابت. أما العمليات الحسابية على هذه العناوين (إن لم تكن مصفوفة ) وعناوين متغيرات المكدس، فلا تُعتبر تعبيرات ثابتة.
استيراد std ؛int main () { int x = 3 ; static float val = 3.0f ;// خطأ (مدة التخزين التلقائية) // constexpr int* ptr = &x;// موافق (مدة التخزين الثابتة) constexpr float * address = & val ; * address = 4.5f ;std :: println ( "{}" , val ); // يطبع 4.5 }في الوقت نفسه، constexprترتبط المراجع إما بمتغيرات ذات مدة تخزين ثابتة أو constexprبمتغيرات (بغض النظر عن مدة التخزين). [ 17 ]
استيراد std ؛int main () { static char ch = 'A' ; constexpr char & ref1 = ch ; ref1 = 'c' ; std :: println ( "{}" , ref1 ); // يطبع 'c'constexpr عدد صحيح = 100 ; constexpr int & ref2 = num ;std :: println ( "{}" , ref2 - 2 ); // يطبع 98 }الوظائف
الدالة constexprهي دالة يمكن حساب قيمتها المرجعية أثناء الترجمة (أي عندما تكون الوسائط تعبيرات ثابتة)، وعند استدعائها أثناء التشغيل، تتصرف كدالة عادية. [ 5 ]constexpr تتوقف عملية الترجمة عند استدعاء دالة يتم تقييمها أثناء الترجمة إذا حدث سلوك غير محدد. [ 14 ] الدوالconstexpr ضمنية inline. [ 1 ]
constexpr double div ( double a , double b ) noexcept { return a / b ; }constexpr double x = div ( 1 , 0 ); // يمنع الترجمة، بسبب استدعاء سلوك غير مُعرَّفلأن أنواع الإرجاع constexprللدوال قد تكون معروفة في وقت الترجمة، فإنه يمكن استدعاؤها في وقت الترجمة لاستخدامها في تعبيرات وقت الترجمة.
constexpr int getFive () noexcept { return 5 ; }int numbers [ getFive () + 7 ]; // يُنشئ مصفوفة من 12 عددًا صحيحًاقد لا تكون الروتينات الفرعيةconstexpr كذلك . تاريخيًا، constexprكانت الدوال تخضع لقيود أكثر بكثير، بما في ذلك منع استخدام returnعبارات متعددة، tryوكتل برمجية، وكتل تجميع مضمنة ، وقد تم تخفيف كل هذه القيود تدريجيًا مع كل مراجعة. [ 1 ] [ 18 ]
سمحت لغة C++17 باستخدام أنواع الإغلاق ووظائف لامدا في محتوى التقييم الثابت. [ 19 ]
يمكن أيضًا تعريف توابع الأصناف والمعاملات القابلة للتحميل الزائدconstexpr باستخدام `. قبل C++14 ، constexprكانت التوابع تتمتع constبوصول ضمني، مما يمنعها من التلاعب بالصنف. [ 5 ] قبل C++20، لم يكن من الممكن تعريف الدوال الافتراضيةconstexpr باستخدام `. [ 1 ] [ 20 ]
البناة والمدمرون
المُنشئ هو دالة تسمح بتهيئة الفئة وتعريفها في وقت الترجمة. تخضع المُنشئات لنفس متطلبات الدوال. [ 19 ] حتى constexprإصدار C++26 ، لم يكن بإمكان الفئات التي تحتوي على فئات أساسية أن تمتلك مُنشئات. يهدف إدخال الوراثة الافتراضية في النهاية إلى السماح بتنسيق التدفقات من خلال مُنشئ . [ 21 ] يُضمن أن يكون المُنشئ المُولّد ضمنيًا صحيحًا إذا كانت الفئة من نوع حرفي. [ 22 ] [ 23 ]constexprconstexprvirtualconstexprconstexprconstexprconstexprstd::ios_baseconstexpr
في الوقت نفسه، يُعدّ المُدمِّر (الذي تم تقديمه في C++20) مُدمِّرًا constexprيسمح بتدمير الكائن في وقت الترجمة. ومثل المُنشئات، constexprتخضع المُدمِّرات لنفس متطلبات constexprالدوال. [ 19 ] كانت الدوافع الرئيسية لتقديم constexprالمُدمِّرات هي السماح باستخدام فئات غير تافهة في وقت الترجمة، مثل `<input>` std::stringو` std::vector<input>`، حيث تُستخدم الأخيرة على نطاق واسع في واجهة برمجة تطبيقات انعكاسstd::meta وقت الترجمة لـ `<input>` . [ 24 ] يسمح هذا الآن بتخصيصات وتدميرات غير تافهة في سياقات وقت الترجمة. [ 25 ] يُضمن أن يكون المُدمِّر المُولَّد ضمنيًا فارغًا إذا كانت الفئة من نوع حرفي. [ 26 ] ومثل المُنشئات، كانت المُدمِّرات تاريخيًا تمنع تدمير الفئات ذات الفئات الأساسية. في C++26، أصبحت فئات مكتبة قياسية مختلفة ، والتي كانت تاريخيًا مخصصة لوقت التشغيل فقط، مؤهلة للاستخدام في وقت الترجمة من خلال المُدمِّرات. [ 27 ]constexprconstexprconstexprvirtualconstexpr
يمكن تعريف فئة تحتوي على أعضاء ثابتة هي نسخ من نفسها constexpr، ولكن يجب أولاً تعريف الحقول داخل الفئة، constبينما constexprيجب أن تكون التعريفات خارج الفئة. محاولة تعريف نسخة constexprمن فئة كعضو staticفي نفسها تفشل، حيث لا يمكن تعريف كائن كنوع غير مكتمل، وبالتالي تظل الفئة غير مكتملة حتى يتم إغلاقها. [ 28 ]
بنية اللون { uint8_t r ; uint8_t g ; uint8_t b ;constexpr Color ( uint8_t r , uint8_t g , uint8_t b ) noexcept : r { r }, g { g }, b { b } {}constexpr ~ Color () = default ;static const Color BLACK ; static const Color RED ; static const Color GREEN ; static const Color YELLOW ; static const Color BLUE ; static const Color MAGENTA ; static const Color CYAN ; static const Color WHITE ; };inline constexpr Color Color :: BLACK = Color ( 0 , 0 , 0 ); inline constexpr Color Color :: RED = Color ( 255 , 0 , 0 ); inline constexpr Color Color :: GREEN = Color ( 0 , 255 , 0 ); inline constexpr Color Color :: YELLOW = Color ( 255 , 255 , 0 ); inline constexpr Color Color :: BLUE = Color ( 0 , 0 , 255 ); inline constexpr Color Color :: MAGENTA = Color ( 255 , 0 , 255 ); inline constexpr Color Color :: CYAN = Color ( 0 , 255 , 255 ); inline constexpr Color Color :: WHITE = Color ( 255 , 255 , 255 );عبارات if في وقت الترجمة
تتميز لغة C++ بنوعين من عبارات if في وقت الترجمة : و . [ 29 ]ifconstexprifconsteval
يسمح الأسلوب الأول، الذي تم تقديمه في C++17 ، بالتفرع الشرطي أثناء الترجمة. ويشترط أن يكون الشرط تعبيرًا ثابتًا قابلًا للتحويل إلى . [ 29 ] يتجاهل هذا الأسلوب الفرع الذي لم يتم تنفيذه، مما يمنعه من الترجمة. وهذا يسمح بالترجمة الشرطية دون استخدام المعالج المسبق. ومع ذلك، فإن الفرع المتجاهل، حتى لو لم تتم ترجمته، يشترط المترجم أن يكون صحيحًا نحويًا أو مقبولًا. [ 30 ] لا تشارك العبارات في عبارة متجاهلة في استنتاج نوع الإرجاع للدالة .ifconstexprboolifconstexprreturn
استيراد std ؛باستخدام std :: conditional_t ؛ باستخدام std :: is_pointer_v ؛ باستخدام std :: remove_pointer_t ؛template < typename T > constexpr auto getValue ( T t ) noexcept -> conditional_t < is_pointer_v < T > , remove_pointer_t < T > , T > { if constexpr ( is_pointer_v < T > ) { return * t ; } else { return t ; } }int main () { int * numbers = new int [ 5 ]{ 1 , 2 , 3 , 4 , 5 }; int firstNumber = getValue ( numbers ); int five = getValue ( 5 );حذف الأرقام ؛ }أما الأخير، الذي تم تقديمه في C++23 ، فيعمل كشرط حيث يكون الشرط هو ما إذا كان يتم تقييم الشرط في وقت الترجمة أم لا، بدلاً من وقت التشغيل. [ 31 ]ifconstevalifconstexprif
template < typename T > constexpr T * arrayOfLength ( size_t n ) { if consteval { // لا يجوز أن يخرج المصفوفة من نطاق تعبير وقت الترجمة return nullptr ; } else { // في وقت التشغيل، اسمح بإرجاع مؤشر إلى مصفوفة مُخصصة في الذاكرة الديناميكية return new T [ n ]; } }ifconstevalيُقدّم صيغة إضافية: وهي مكافئة لـ . [ 29 ]if!consteval{/* stmt1 */}else{/* stmt2 */}ifconsteval{/* stmt2 */}else{/* stmt1 */}
تطور
لقد تطور المحدد constexprمع كل مراجعة لمعيار C++، إما برفع القيود المفروضة على constexprاستخدام الكلمة المفتاحية أو بإدخال سياقات جديدة لها، حيث أن الكلمة المفتاحية التاريخية constexprفي C++11 كانت تخضع لقيود أكثر بكثير مما هي عليه في C++ المعاصرة.
C++11
في مسودة C++11 لعام 2008 ، constexprسُمح للدوال باستدعاء نفسها بشكل متكرر . [ 32 ] وفي وقت لاحق من عام 2010، سُمح لدوال constexpr بتمرير مُعاملاتها كمرجع ثابت. [ 33 ] وفي عام 2011، سُمح بإجراء static_assertعمليات التحقق usingوالعبارات ضمن سياقات constexprالدوال. [ 34 ] وفي معيار C++11 النهائي، constexprسُمح للدوال بعبارة إرجاع واحدة فقط . [ 1 ]
C++14
أزالت لغة C++14 القيد الذي constexprكان يقيد جميع الطرق بأنها ضمنية const، مما يسمح constexprللطرق بتغيير قيم متغيرات الأعضاء. [ 5 ]
سمحت لغة C++14 باستخدام عبارات إرجاع متعددة ، وكتل تحكم في تدفق البرنامج مثل if/ elseو switch، والحلقات ، وتعريف المتغيرات داخل constexprالدوال. [ 35 ] كما سمحت C++14 constexprللدوال بتحديد voidنوع الإرجاع. يوضح المثال التالي مدققًا للأعداد الأولية يعمل أثناء الترجمة.
constexpr uint64_t PRIME_CANDIDATE = 264223787557 ;constexpr bool isPrime ( uint64_t number ) noexcept { if ( number < 2 ) { return false ; } else if ( number == 2 || number == 3 ) { return true ; } else if ( number % 2 == 0 || number % 3 == 0 ) return false ; } for ( uint64_t i = 5 ; i * i <= number ; i += 6 ) { if ( number % i == 0 || number % ( i + 2 ) == 0 ) { return false ; } } return true ; }static_assert ( isPrime ( PRIME_CANDIDATE ));C++17
نصّت لغة C++17 على أن constexprالمُحدِّد في تعريف دالة أو متغير عضو ثابت يجعلها ضمنيًا inline. [ 1 ] وقد أدخلت C++17 خاصية ، مما أثّر على برمجة القوالب الوصفية . [ 29 ]ifconstexpr
منذ إصدار C++17، أصبح بالإمكان استخدام أنواع الإغلاق ودوال لامدا في التعبيرات الثابتة. [ 19 ] جميع دوال لامدا ضمنية constexpr. [ 19 ]
constexpr int FACTOR = 10 ;constexpr auto scaleBy = [ FACTOR ]( int x ) -> int { return x * FACTOR ; };static_assert ( scaleBy ( 4 ) == 40 );C++20
خففت لغة C++20 القيود المفروضة على constexprالتقييم في سياقات متنوعة [ 19 ] [ 20 ] [ 25 ] ، بما في ذلك استدعاءات الدوال الافتراضية، وتخصيص الذاكرة المؤقتة، constexprوالدوال المدمرة [ 1 ] [ 25 ] ، وغيرها. يجب أن يكون معروفًا أنه سيتم تحرير الذاكرة المخصصة في سياقات معينة داخل تلك السياقات. [ 25 ]constexprconstexpr
رفعت لغة C++20 القيود المفروضة على constexprالطرق الافتراضية . [ 1 ] [ 20 ]
class Base { public : virtual constexpr size_t foo () const { return sizeof ( int ); }constexpr virtual ~ Base () = default ; };class MyIntArray : public Base { private : int * a ; const size_t length ; public : constexpr size_t foo () const override { return length ; }constexpr MyIntArray ( size_t n ) : a { new int [ n ]}, length { n } {}constexpr ~ MyIntArray () override { delete [] a ; }constexpr int & operator []( size_t i ) { return a [ i ]; }constexpr const int & operator []( size_t i ) const { return a [ i ]; }MyIntArray ( const MyIntArray & ) = delete ; MyIntArray & operator = ( const MyIntArray & ) = delete ; };C++23
سمحت لغة C++23 للدوال باحتواء gotoعبارات، tryوكتل، ومتغيرات ثابتة ، وتجميع مضمن. [ 1 ] كما قدمت C++23 أيضًا [ 29 ] .ifconsteval
C++26
تسمح لغة C++26 باستخدام الوراثة الافتراضية في الدوال البانية والمدمرة المُعلنة باستخدام constexpr. [ 21 ]constexpr أُضيفت دعم للربط الهيكلي [ 17 ] ، constexprوالتحويل من [ 36 ] ، والتوزيع [ 37 ] ، بالإضافة إلى إمكانية طرح الاستثناءات. [ 38 ] كما أُضيف دعم إضافي لأنواع المكتبة القياسية. [ 27 ]void*constexprnewconstexprconstexpr
تم نشر اقتراح constexprللروتينات الفرعية في عام 2025 من قبل هانا دوسيكوفا لاعتماده في C++26، ولكن تم تأجيله إلى C++29. [ 39 ]
consteval
يُستخدم مُحدِّد الدالة consteval لتحديد أن الدالة "دالة فورية" [ 10 ] ، أي أن كل استدعاء للدالة يجب أن يُنتج تعبيرًا ثابتًا في وقت الترجمة. بعبارة أخرى، لا يُمكن تنفيذ الدالة إلا في وقت الترجمة . [ 3 ] إذا لم يتمكن المُترجم من تقييم الاستدعاء في وقت الترجمة، فسيفشل البرنامج في الترجمة. [ 40 ]consteval ويُستخدم أيضًاللكتل. [ 29 ]ifconsteval
استيراد std ؛باستخدام std :: array ;consteval int square ( int x ) { return x * x ; }template < size_t N > consteval array < int , N > squaresUpTo () { array < int , N > squares ; for ( size_t i = 0 ; i < N ; ++ i ) { squares [ i ] = square ( i ); } return squares ; }int main () { constexpr int a = square ( 5 ); // صحيح: تم تقييمه في وقت الترجمة// صحيح: تم التقييم في وقت الترجمة لأن الدالة square() ثابتة int b = square ( 5 ); constexpr array < int , 5 > table = squaresUpTo <5> (); int x = 3 ; // غير صحيح: x ليس تعبيرًا ثابتًا // int y = square(x); }constinit
constinit هو مُحدِّد متغير يضمن التهيئة الثابتة ، مع مدة تخزين ثابتة / عامة أو تخزين في خيط (thread_local)، ويتطلب التهيئة بتعبير ثابت.constinitيُنتج خطأ في الترجمة إذا استُخدم على متغير محلي أو إذا فشل في التهيئة أثناء الترجمة. [ 4 ]constinit لا يعني عدم قابلية التغيير، وبالتالي يمكن اعتباره متغيرًا قابلًا للتغيير أثناء الترجمة. [ 40 ]constinit لا يمكن استخدامه معconstexpr، ولكن عندما يكون المتغير المُعلن عنه مرجعًا ، فإنه يُكافئconstexpr.constinitلا يُلزم بتدمير ثابت أوconstتأهيل -، مما يسمح بوجود كائنات ذاتconstexprمُنشئات ولكن بدونconstexprمُدمِّر.
const char * bar () { return "التهيئة الديناميكية" ; }constexpr const char * foo ( bool b ) { return b ? "Constant initializer" : bar (); }// حسنًا: تم التهيئة في وقت الترجمة constinit const char * s1 = foo ( true );// غير صحيح: bar() ليس تعبيرًا ثابتًا // constinit const char* s2 = foo(false);constinitيُستخدم هذا لمنع ما يُسمى بـ "فشل ترتيب التهيئة الثابتة"، حيث يتم تهيئة الكائنات العامة (أو الثابتة) في وحدات ترجمة مختلفة بترتيب غير محدد. [ 11 ]
بلغات أخرى
constexprتتضمن اللغات الأخرى ما يُعادل `<code>` constفي لغة C# ، [ 41 ] و Dart، [ 42 ] و Rust ، [ 43 ] حيث تُعرّف هذه الصيغ الرموز على أنها تُنفّذ في وقت الترجمة. كما تحتوي Rust على ` <code> `، وهو ما يُعادل دالة في C++. [ 44 ] تسمح لغة Go باستخدام الثوابت في وقت الترجمة، ولكن ليس الدوال. [ 45 ] تتميز لغة Zig بكلمة مفتاحية `<code>` لإجبار تنفيذ التعليمات البرمجية في وقت الترجمة. [ 46 ]constfnconstexprconstcomptime
تتضمن مكتبة جافا، ، تعليقًا توضيحيًا يحاكي لغة C ++ في جافا. [ 47 ] في الوقت نفسه، يُعتبر المتغير المُعلن عنه باستخدام و من النوع الأولي أو تعبيرًا ثابتًا. [ 48 ]net.onedaybeard.constexpr@ConstExprconstexprstaticfinaljava.lang.String
انظر أيضاً
مراجع
- 1 2 3 4 5 6 7 8 9 10 cppreference.com. "constexpr specifier (since C++11)" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- 1 2 cppreference.com. "constexpr specifier (منذ C23)" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- 1 2 "محدد consteval (منذ C++20)" . cppreference.com . cppreference.com . تم الاطلاع عليه في 3 مايو 2026 .
- 1 2 "constinit specifier (منذ C++20)" . cppreference.com . cppreference.com . تم الاطلاع عليه في 3 مايو 2026 .
- 1 2 3 4 5 6 مايكروسوفت ليرن (22 فبراير 2023). "constexpr (C++)" . learn.microsoft.com . مايكروسوفت ليرن.
- 1 2 3 غابرييل دوس ريس، بيارن ستروستروب، ينس مورير (3 نوفمبر 2006). “التعبيرات الثابتة المعممة – المراجعة 5” (PDF) . open-std.org .
{{cite web}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ غابرييل دوس ريس (21 سبتمبر 2003). "التعبيرات الثابتة المعممة" (ملف PDF) . open-std.org . WG21.
- ↑ هيرب ساتر (21 يونيو 2025). "تقرير رحلة: اجتماع معايير ISO C++ في يونيو 2025 (صوفيا، بلغاريا)" . herbsutter.com . هيرب ساتر.
- ↑ ساتر، هيرب (21 يونيو 2025). " تقرير رحلة: اجتماع معايير ISO C++ في يونيو 2025 (صوفيا، بلغاريا)" . herbsutter.com . herbsutter.com . تم الاطلاع عليه في 10 أبريل 2026.
حتى اليوم، ربما كان أهم استطلاع رأي فردي في تاريخ لغة C++ هو الاستطلاع الذي أُجري في تورنتو في يوليو 2007 لاعتماد ورقة "constexpr" الأولى لبيارن ستروستروب وغابرييل دوس ريس في مسودة C++11. بالنظر إلى الوراء الآن، يمكننا أن نرى التحول الجذري الذي أحدثه ذلك بالنسبة للغة C++.
- 1 2 ريتشارد سميث، أندرو ساتون، دافيد فانديفورد (4 أكتوبر 2018). "الوظائف الفورية" . open-std.org . WG21.
{{cite web}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - 1 2 إريك فيسيلييه (18 يوليو 2019). "إضافة الكلمة المفتاحية constinit" . open-std.org . WG21.
- ↑ باري ريزفين، بيتر ديموف (13 مارس 2025). "القيم والمتغيرات الخاصة بـ Consteval فقط" . open-std.org . WG21.
- ↑ أليكس جيلدينج، ينس جوستيدت (6 يوليو 2022). "محدد constexpr لتعريفات الكائنات" . open-std.org . WG14.
- 1 2 WG21. "7 - التعبيرات، 7.7 - التعبيرات الثابتة" . eel.is. WG21 . تم الاطلاع عليه في 14 أبريل 2026 .
{{cite web}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط ) - ↑ cppreference.com. "التعبيرات الثابتة - الكيانات المُهيأة الثابتة" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- ↑ cppreference.com. "إعلان الربط المهيكل (منذ C++17)" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 11 مايو 2026 .
- 1 2 3 جابوت، كورنتين؛ بي، برايان (12 نوفمبر 2024). "روابط constexpr المهيكلة والمراجع إلى متغيرات constexpr" (ملف PDF) . open-std.org . تم الاطلاع عليه في 10 مايو 2026 .
- ↑ ريتشارد سميث (15 مارس 2013). "تخفيف القيود على دوال constexpr" . WG21.
- 1 2 3 4 5 6 "constexpr specificifier (since C++11)" . cppreference.com . cppreference.com. 2026 . تم الاطلاع عليه بتاريخ 25 أبريل 2026 .
- 1 2 3 بيتر ديموف، فاسيل فاسيليف (4 مايو 2018). "السماح باستدعاء الدوال الافتراضية في التعبيرات الثابتة" . open-std.org . WG21.
- 1 2 هانا دوسيكوفا (17 فبراير 2025). "الميراث الظاهري constexpr" . open-std.org . WG21.
- ↑ cppreference.com. "المنشئات الافتراضية" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- ↑ cppreference.com (14 أبريل 2026). "التعبيرات الثابتة - النوع الحرفي" . cppreference.com . cppreference.com.
- ↑ وايت تشيلدرز وآخرون (26 يونيو 2024). "P2996R4 - الانعكاس لـ C++26" . isocpp.org . WG21.
- 1 2 3 4 بيتر ديموف (19 يوليو 2019). "المزيد من حاويات constexpr" . open-std.org . WG21.
- ↑ cppreference.com. "المدمرات" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- 1 2 هانا دوسيكوفا (11 فبراير 2025). "حاويات ومحولات constexpr" . open-std.org . WG21.
- ↑ WG21 (23 أبريل 2026). "مسودة معيار C++ - التصريحات والتعريفات" . eel.is. WG21.
في تعريف الكائن، يجب ألا يكون نوع هذا الكائن نوعًا غير مكتمل ([basic.types.general])، أو نوع فئة مجردة ([class.abstract])، أو مصفوفة (ربما متعددة الأبعاد) منه.
{{cite web}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط ) - 1 2 3 4 5 6 cppreference.com. "عبارة if" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- ↑ ينس ماورر (20 يونيو 2016). "P0292R2: constexpr if: صيغة مختلفة قليلاً" . open-std.org . WG21.
- ↑ باري ريفزين، ريتشارد سميث، أندرو ساتون، دافيد فانديفورد (22 مارس 2021). "إذا كان consteval" . open-std.org . WG21.
{{cite web}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ لورانس كرول (5 فبراير 2009). "مشاكل مع Constexpr" . open-std.org . WG21 . تم الاطلاع عليه في 15 أبريل 2026 .
- ↑ ستروستروب، بيارن (14 فبراير 2010). "دوال Constexpr ذات المعاملات المرجعية الثابتة (ملخص)" (ملف PDF) . open-std.org . WG21 . تاريخ الاسترجاع: 15 أبريل 2026 .
- ↑ ميريل، جيسون (25 مارس 2011). "static_assert وتهيئة القوائم في دوال constexpr" . open-std.org . WG21 . تم الاطلاع عليه في 15 أبريل 2026 .
- ↑ ريتشارد سميث (15 مارس 2013). "تخفيف القيود على دوال constexpr" . open-std.org . WG21.
- ↑ كورنتين جابوت، ديفيد ليدجر (13 فبراير 2023). "تحويل constexpr من void*: نحو محو نوع constexpr" (ملف PDF) . open-std.org . WG21.
- ^ باري ريزفين (19 مارس 2024). "موضع constexpr جديد" . open-std.org . WG21.
- ^ هانا دوسيكوفا (19 نوفمبر 2024). "السماح بطرح الاستثناءات في التقييم المستمر" . open-std.org . WG21.
- ^ هانا دوسيكوفا (17 فبراير 2025). "كوروتينات كونستيكسبر" . open-std.org . WG21.
- 1 2 "const vs constexpr vs consteval vs constinit in C++20" . cppstories.com . 28 نوفمبر 2022. تم الاطلاع عليه في 3 مايو 2026 .
- ↑ مايكروسوفت ليرن (26 يناير 2026). "الكلمة المفتاحية const" . learn.microsoft.com . مايكروسوفت ليرن.
- ↑ والراث، كاثي؛ لاد، سيث (2013). دارت: لغة جديدة سهلة الاستخدام لتطبيقات الويب المهيكلة . أورايلي ميديا . ص 15. ISBN 978-1-449-33089-7.
- ↑ مؤسسة لغة رست (25 مارس 2026). "الكلمة المفتاحية const" . doc.rust-lang.org . مؤسسة لغة رست.
- ↑ مؤسسة لغة Rust (30 أبريل 2026). "مرجع Rust - التقييم الثابت" . doc-rust.lang.org . مؤسسة لغة Rust.
- ↑ روب بايك (25 أغسطس 2014). "الثوابت" . go.dev . مدونة Go.
- ↑ zig.guide (4 يناير 2026). "Comptime" . zig.guide . مؤسسة Zig Software.
- ↑ أدريان باباري. "junkdog/constexpr-java" . github.com.junkdog . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- ↑ شركة أوراكل. "الفصل 15. التعابير - 15.28. التعابير الثابتة" . docs.oracle.com . مواصفات لغة جافا . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
- لغة البرمجة سي
- لغة سي++
- متغير (علوم الحاسوب)
