سي++11
سي++11  هي إصدار معاير للغة البرمجة سي++. تم التصديق عليها من المنظمة الدولة للمعاير في 12 أغسطس 2011 بدلا من سي++03، ثم استبدلت بسي++14 في 18 أغسطس 2014، وفيما بعد بسي++17 والتي ما زالت قيد التطوير. الاسم يتبع تقليد تسمية إصدارات اللغة بسنة نشر المواصفات، رغم أنها سميت سابقا C++0x لأنه كان من المتوقع أن تنشر قبل عام 2010.

على الرغم من أن أحد أهداف التصميم هي تفضيل التغيير في المكتبات على التغيير في نواة اللغة، إلا أن سي++11 تضمنت إضافات عديدة لنواة اللغة. أجزاء نواة اللغة التي تم تحسينها بشكل كبير تتضمن دعم الخيوط المتعددة ودعم  البرمجة العمومية والتهيئة الموحدة والأداء. تم عمل العديد من التغييرات الجوهرية أيضا لمكتبة سي++ القياسية، حيث تم دمج معظم مكتبات تقرير سي++ الفني 1 فيما عدا مكتبة الوظائف الرياضية الخاصة.

تم نشر سي++11 كـ ISO/IEC 14882:2011 في سبتمبر 2011 وهو متاح مقابل رسوم. مسودة العمل الأكثر شبها بمعيار سي++11 المنشور هي N3337 بتاريخ 16 يناير 2012  وهي تحتوي فقط على تصليحات تحريرية لمعيار سي++11.

أهداف التصميم 
حاولت لجنة التصميم الالتزام بعدد من الأهداف عند تصميم سي++11:
 الحفاظ على الاستقرار والتوافق مع سي++98 وقدر الإمكان مع سي
 تفضيل إدخال الميزات الجديدة عن طريق المكتبة القياسية بدلا من تطوير نواة اللغة
 تفضيل التغيرات التي يمكنها تطوير طريقة البرمجة
 تحسين سي++ لتسهيل تصميم المكتبات والأنظمة بدلا من إدخال ميزات جديدة مفيدة فقط لنوع معين من التطبيقات
 زيادة سلامة النوع بتوفير بدائل آمنة عن الطرق الغير آمنة السابقة
 زيادة الأداء والقدرة على العمل مباشرة مع العتاد الصلب
 توفير حلول مناسبة لمشاكل الواقع
 تنفيذ مبدأ بدون-نفقات (الدعم الإضافة اللازم لبعض الخدمات يجب استخدامه فقط إذا استخدمت تلك الخدمات)
 جعل السي++ سهلة التعليم والتعلم بدون حذف أي خدمات يحتاجها المبرمجين ذوي الخبرة
اعتُبِر الاهتمام بالمبتدئين أمرا هاما، لأن معظم مبرمجين الحاسوب مبتدئين، ولأن الكثير منهم لا يوسعون معرفتهم أبدا مقيدين أنفسهم بالعمل باللغة المتخصصين بها فقط.

الإضافات لنواة لغة السي++ 
أحد وظائف لجنة السي++ هي تطوير نواة اللغة. أجزاء نواة اللغة التي تم تحسينها بشكل كبير تتضمن دعم الخيوط المتعددة ودعم البرمجة العمومية والتهيئة الموحدة والأداء.

من أجل أهداف هذا المقال، فقد تم تجميع ميزات وتعديلات نواة اللغة إلى أربعة أقسام عاملة: تحسينات الأداء في وقت التنفيذ، تحسينات الأداء في وقت البناء، التحسينات المتعلقة بسهولة الاستخدام، القدرات الوظيفية الجديدة. بعض الميزات يمكن أن تتبع أكثر من قسم، لكنها ذكرت فقط في القسم الذي يمثل هذه الميزة بشكل رئيسي.

تحسينات أداء نواة اللغة لوقت التنفيذ 
ميزات اللغة هذه تتواجد بشكل رئيسي لتوفير بعض فوائد الأداء، سواء للذاكرة أو للسرعة الحاسوبية.

القيمة اليمنى المرجعية ومشيدات النقل 
في سي++03 وما قبلها وكما هو الحال في السي، فإن المؤقتات temporaries (تسمى القيم اليمنى rvalues حيث أنها تكون عادة على الجانب الأيمن من معامل التخصيص) لا تكون قابلة للتعديل أبدا ولا يمكن تمييزها من الانواع &const T، ومع ذلك ففي بعض الحالات يمكن تعديل المؤقتات، وهو سلوك كان يعتبر مخرجا مفيدا. في سي++11 تم إضافة نوع مرجعي جديد غير ثابت يسمى قيمة يمينية مرجعية وتعرف بـ&&T. وهذا يشير إلى المؤقتات التي يسمح بتعديلها بعد تهيئتها، بغرض السماح «بدلالات النقل».

المشكلة المزمنة في الأداء في سي++03 هي النسخ العميق deep copy المكلف والغير ضروري والذي يحدث ضمنيا عند تمرير الكائنات بالقيمة. لتوضيح ذلك اعتبر أن <std::vector<T غلافاً حول مصفوفة داخلية ذات حجما ما. إذا تم إنشاء كائن <std::vector<T مؤقت وإرجاعه من دالة، فسيمكن تخزينه فقط بإنشاء كائن <std::vector<T جديد ونسخ بيانات كل القيم اليمنى إليه. ثم يتم تدمير الكائن المؤقت وكل الذاكرة المخصصة له (لتبسيط هذا النقاش تم إهمال عملية تحسين القيمة المرجعة).

مشيد النقل move constractor في سي++11 للصنف <std::vector<T والذي يأخذ قيمة يمنى مرجعية من <std::vector<T يمكنه نسخ مؤشر المصفوفة الداخلية من القيمة اليمنى إلى الكائن <std::vector<T الجديد، ثم تغيير المؤشر داخل القيمة اليمنى إلى القيمة لا شيء (Null). وبما أن الكائن المؤقت لن يُستخدَم مرة أخرى أبدا فليس هناك أي أوامر ستحاول الوصول إلى ذلك المؤشر الداخلي، ولأن المؤشر يشير على لا قيمة فإن الذاكرة لن تُحذَف عند الخروج من مجال الدالة. وبالتالي فإن هذه العملية لا تستغني عن نفقات النسخ العميق فقط لكنها أيضا آمنة ومخفية.

يمكن للقيم اليمنى المرجعية أن توفر فوائد الأداء للأوامر البرمجية الموجودة دون الحاجة لعمل أي تعديلات خارج المكتبة القياسية. نوع القيمة المرجعة من الدالة التي تعيد <std::vector<T مؤقت لا تحتاج التغيير الصريح إلى && <std::vector<T لاستدعاء مشيد النقل، حيث تعتبر المؤقتات قيم يمينية تلقائياً (ومع ذلك إذا كان <std::vector<T في الإصدار سي++03 بدون مشيد النقل فسيتم استدعاء مشيد النسخ بـ& <const std::vector<T مسبباً استهلاك مساحة كبيرة من الذاكرة).

لأسباب متعلقة بالسلامة فقد تم فرض بعض القيود. فالمتغيرات المسماة لا يتم اعتبارها أبداً قيمة يمينية، حتى لو تم تعريفها كذلك. وللحصول على قيمة يمينية فيجب استخدام قالب الدالة ()std::move. ولا يمكن تعديل القيم اليمنى المرجعية إلا في ظروف معينة، حيث أنها معدة بشكل رئيسي للاستخدام مع مشيدات النقل.

بسبب طبيعة صياغة القيم اليمنى المرجعية وبسبب بعض التعديلات في صياغة القيم اليسرى المرجعية (المراجع العادية) فإن القيم اليمنى المرجعية تسمح للمطورين بتوفير إعادة توجيه أفضل للدوال function forwarding. وعند الجمع مع القوالب متغيرة المعطيات variadic templates فإن هذه القدرة تسمح للدوال ذات القوالب بإعادة توجيه المعطيات لدالة أخرى يمكنها أخذ تلك المعطيات. تعد الاستفادة الأكبر لإعادة توجيه معطيات المشيد هي إنشاء دوال مُصنّعة factory functions والتي ستستدعي تلقائياً المشيد الصحيح لتلك المعطيات. وقد تم رؤية ذلك في مجموعة emplace_back من دوال مكتبة سي++ القياسية.

التعبيرات الثابتة المعممة - constexpr 
دائما ما كان لدى السي++ مفهوم التعبيرات الثابتة constant expression. هذه التعبيرات مثل 3+4 تعطي نفس النتيجة دائماً، في وقت الترجمة compile time وفي وقت التنفيذ run time. تعد التعبيرات الثابتة من فرص التحسين للمترجمات، حيث تقوم المترجمات غلباً بتنفيذها في وقت الترجمة وتضع النتيجة بدلاً من التعبير نفسه في البرنامج. أيضا في كثير من الأماكن تتطلب مواصفات سي++ استخدام التعبيرات الثابتة. فتعريف مصفوفة يتطلب تعبير ثابت وقيم القائمة العددية enumerator يجب أن تكون تعبيرات ثابتة.

ومع ذلك فإن التعبيرات الثابتة لم تسمح أبداً باستدعاء دالة أو مشيد لكائن. لذلك فإن مجموعة الأوامر البسيطة التالية غير مقبولة:int get_five() {return 5;}

int some_value[get_five() + 7]; // إنشاء مصفوفة من 12 عنصر، غير مقبول في السي بلس بلس

ذلك لم يكن مقبول في سي++03 لأن get_five() + 7 ليست تعبير ثابت. مترجم سي++03 لم يكن قادراً على معرفة ما إذا كان ()get_five ثابت فعلا في وقت التنفيذ. نظرياً هذه الدالة يمكن أن تؤثر على متغير كوني global variable أو استدعاء دوال أخرى غير ثابتة في وقت التنفيذ، إلخ.

قدمت سي++11 الكلمة المفتاحية constexpr والتي تسمح للمستخدم في وقت الترجمة أن يضمن أن الدالة أو مشيد الكائن ثابتاً. المثال السابق يمكن إعادة كتابته كالتالي:

constexpr int get_five() {return 5;}

int some_value[get_five() + 7]; // إنشاء مصفوفة من 12 عنصر، مقبول في السي++11

هذا يسمح للمترجم من الفهم والتأكد من أن ()get_five ثابتة وقت الترجمة.

استخدام constexpr مع الدالة يفرض بعض القيود على ما يمكن للدلة أن تفعله. أولا يجب أن يكون نوع البيانات المرجع من الدالة غير فارغ void. ثانيا داخل جسم الدالة لا يمكن الإعلان عن متغيرات أو تعريف أنواع بيانات جديدة. ثالثا جسم الدالة يمكن فقط أن يحتوي على إعلانات أو جمل فارغة null وجملة إرجاع واحدة. يجب أن يتواجد قيم معطيات بحيث أنه بعد ابدال المعطيات فإن التعبير في جملة الإرجاع ينتج تعبير ثابت.

قبل سي++11 كان يمكن استخدام قيم المتغيرات في التعبيرات الثابتة فقط إذا كانت المتغيرات معلن عن أنها ثابتة بـconst وتم تهيئتها بتعبير ثابت ونوعها أرقم صحيحة أو قائمة عددية. في سي++11 تم حذف القيد المتعلق بأن يكون نوع المتغيرات أرقام صحيحة أو قائمة عددية إذا تم تعريفها باستخدام الكلمة المفتاحية constexpr:constexpr double earth_gravitational_acceleration = 9.8;
constexpr double moon_gravitational_acceleration = earth_gravitational_acceleration / 6.0;هذه المتغيرات ثابتة ضمنياً const ويجب أن تهيأ بتعبير ثابت.

لإنشاء قيم بيانات تعبير ثابت من أنواع بيانات معرفة من قبل المستخدم فإن المشيدات يمكن أيضا الإعلان عنها بـconstexpr. جسم دالة مشيد المعلن عنه كتعبير ثابت يمكن أن يحتوى على إعلانات وجمل فارغة فقط، ولا يمكن الإعلان عن متغيرات أو تعرف أنواع بيانات كما هو الحال مع الدوال المعلن عنها بـconstexpr. يجب أن تتواجد قيم معطيات بحيث أنه بعد ابدال المعطيات فإن تهيئة عناصر الصنف سينتج تعبيرات ثابتة. المهدمات لهذه الأنواع يجب أن تكون بسيطة.

عادة يجب تعريف مشيد النسخ لصنف لديه مشيدات تعبيرات ثابتة بأن يكون هو أيضا تعبير ثابت، وذلك للسماح للكائنات من هذا صنف أن يتم إرجاعها بالقيمة من دالة تعبير ثابت. يمكن الإعلان عن أي دالة عضو في الصنف مثل مشيدات النسخ والتحميلات الزائدة للمعاملات وغيرهم كتعبير ثابت طالما أنها مستوفية لشروط الدوال ثابتة التعبير. وهذا يسمح للمترجم أن ينسخ الكائنات في وقت الترجمة ويؤدي العمليات عليهم، إلخ.

إذا تم استدعاء دالة أو مشيد تعبير ثابت بمعطيات غير ثابتة التعبير، فإن الاستدعاء يتصرف كما لو أن الدالة ليست تعبير ثابت، وقيمة النتيجة لا تكون تعبير ثابت كذلك. بالمثل إذا كان تقييم التعبير في جملة الإرجاع لدالة تعبير ثابت لا ينتج تعبيراً ثابتاً فإن النتيجة لن تكون تعبير ثابت.

تعديلات مكتبة سي++ القياسية 
تم إدخال عددا من الميزات الجديدة في المكتبة القياسية لسي++11. العديد منها يمكن تنفيذها تحت المعيار القديم، لكن البعض يعتمد على الميزات الجديدة للنواة في سي++11.

جزء كبير من المكتبات الجديدة تم تعريفه في ملف التقرير الفني لمكتبة لجنة معايير السي++ (يسمى التقرير الفني 1 أو اختصارا TR1)، والذي نُشِر في عام 2005. العديد من التنفيذات الكاملة والجزئية للتقرير متاحة حاليا باستخدام النطاق الاسمي std::tr1. وقد تم نقلهم في سي++11 إلى النطاق الاسمي std. ومع ذلك فلاضافة ميزات التقرير الفني 1 إلى المكتبة القياسية لسي++11 فقد تم تحديثها بحيث تلائم ميزات لغة سي++11 والتي لم تكن متاحة عند الإصدارة المبدئية للتقرير الفني. وأيضا يمكن أن تكون محسنة مع الميزات الممكنة تحت سي++03 ولكن لم تكن جزء من المواصفات الأصلية للتقرير الفني.

اللجنة تعتزم الآن عمل تقرير فني ثاني (سيسمى التقرير الفني 2 أو اختصارا TR2) حيث اكتملت معايير سي++11. اقتراحات المكتبة التي لم تكن جاهزة في وقتها لسي++11 ستوضع في التقرير الفني 2 أو أي تقارير فنية إضافية.

تحسين التوافق مع اللغة سي 
للتوافق مع اللغة سي (من سي99) تم إضافة التالي:
 Preprocessor:
 Headers:

انظر أيضًا 
 سي++
 سي++03

المراجع

وصلات خارجية 
 The C++ Standards Committee
 C++0X: The New Face of Standard C++
 Herb Sutter's blog coverage of C++11
 Anthony Williams' blog coverage of C++11
 A talk on C++0x given by Bjarne Stroustrup at the University of Waterloo
 The State of the Language: An Interview with Bjarne Stroustrup (15 August 2008)
 Wiki page to help keep track of C++ 0x core language features and their availability in compilers
 Online C++11 standard library reference
 Online C++11 compiler
 Bjarne Stroustrup's C++11 FAQ

سي++
عائلة لغة البرمجة سي++
معايير آي إي سي
معايير الأيزو
سي + + 11 هي إصدار معاير للغة البرمجة سي + + . تم ا التصديق علي ها من المنظمة الدولة للمعاير فيأغسطسبدلا من سي + + 03 ، ثم استب دلت بسي + + 14 فيأغسطس و فيما بعد بسي + + 17 و التي ما زالت قيد التطوير . الاسم يتبع تقليد تسمية إصدارات اللغة بسنة نشر المواصفات ، رغم أن ها سميت سابقا C + + 0x لأن ه كان من المتوقع أن تنشر قبل عام على الرغم من أن أحد أهداف التصميم هي تفضيل التغيير في المكتبات على التغيير في نواة اللغة ، إلا أن سي + + 11 تضمنت إضافات عديدة ل نواة اللغة . أجزاء نواة اللغة التي تم تحسين ها ب شكل كبير تتضمن دعم الخيوط المتعددة و دعم البرمجة العمومية و التهيئة الموحدة والأداء . تم عمل العديد من التغييرات الجوهرية أيضا لمكتبة سي + + القياسية ، حيث تم دمج معظم مكتبات تقرير سي + + الفني فيما عدا مكتبة الوظائف الرياضية الخاصة . تم نشر سي + + 11 كـ ISO / IEC2011 في سبتمبروهو متاح مقابل رسوم . مسودة العمل الأكثر شب ها بمعيار سي + + 11 المنشور هي N3337 بتاريخيناير و هي تحتوي فقط على تصليحات تحريرية لمعيار سي + + 11 . أهداف التصميم حاولت لجنة التصميم الالتزام ب عدد من الأهداف عند تصميم سي + + 11 : الحفاظ على الاستقرار والتوافق مع سي + + 98 و قدر ال إمكان مع سي تفضيل إدخال الميزات الجديدة عن طريق المكتبة القياسية بدلا من تطوير نواة اللغة تفضيل التغيرات التي يمكن ها تطوير طريقة البرمجة تحسين سي + + ل تسهيل تصميم المكتبات والأنظمة بدلا من إدخال ميزات جديدة مفيدة فقط لنوع معين من التطبيقات زيادة سلامة النوع ب توفير بدائل آمنة عن الطرق الغير آمنة السابقة زيادة الأداء والقدرة على العمل مباشرة مع العتاد الصلب توفير حلول مناسبة لمشاكل الواقع تنفيذ مبدأ ب دون - نفقات ( الدعم ال إضافة اللازم ل بعض الخدمات يجب استخدام ه فقط إذا استخدمت تلك الخدمات ) جعل السي + + سهلة التعليم و التعلم ب دون حذف أي خدمات يحتاج ها المبرمجين ذوي الخبرة اعتُبِر الاهتمام بالمبتدئين أمرا هاما ، لأن معظم مبرمجين الحاسوب مبتدئين ، و لأن الكثير من هم لا يوسعون معرفة هم أبدا مقيدين أنفس هم ب العمل باللغة المتخصصين ب ها فقط . الإضافات ل نواة لغة السي + + أحد وظائف لجنة السي + + هي تطوير نواة اللغة . أجزاء نواة اللغة التي تم تحسين ها ب شكل كبير تتضمن دعم الخيوط المتعددة و دعم البرمجة العمومية و التهيئة الموحدة والأداء . من أجل أهداف هذا المقال ، ف قد تم تجميع ميزات وتعديلات نواة اللغة إلى أربعة أقسام عاملة : تحسينات الأداء في وقت التنفيذ ، تحسينات الأداء في وقت البناء ، التحسينات المتعلقة ب سهولة الاستخدام ، القدرات الوظيفية الجديدة . بعض الميزات يمكن أن تتبع أكثر من قسم ، لٰكن ها ذكرت فقط في القسم الذي يمثل هذه الميزة ب شكل رئيسي . تحسينات أداء نواة اللغة لوقت التنفيذ ميزات اللغة هذه تتواجد ب شكل رئيسي ل توفير بعض فوائد الأداء ، سواء للذاكرة أو للسرعة الحاسوبية . القيمة اليمنى المرجعية ومشيدات النقل في سي + + 03 و ما قبل ها و كما هو الحال في السي ، ف إن المؤقتات temporaries ( تسمى القيم اليمنى rvalues حيث أن ها تكون عادة على الجانب ال أيمن من معامل التخصيص ) لا تكون قابلة للتعديل أبدا و لا يمكن تمييز ها من الانواع & const T ، و مع ذلك ف في بعض الحالات يمكن تعديل المؤقتات ، و هو سلوك كان يعتبر مخرجا مفيدا . في سي + + 11 تم إضافة نوع مرجعي جديد غير ثابت يسمى قيمة يمينية مرجعية و تعرف بـ &&T . و هٰذا يشير إلى المؤقتات التي يسمح بتعديل ها بعد تهيئة ها ، ب غرض السماح « بدلالات النقل » . المشكلة المزمنة في الأداء في سي + + 03 هي النسخ العميق deep copy المكلف والغير ضروري و الذي يحدث ضمنيا عند تمرير الكائنات بالقيمة . لتوضيح ذلك اعتبر أن <std : : vecto r <T غلافاً حول مصفوفة داخلية ذات حجما ما . إذا تم إنشاء كائن <std : : vecto r <T مؤقت وإرجاع ه من دالة ، فس يمكن تخزينه فقط ب إنشاء كائن <std : : vecto r<T جديد ونسخ بيانات كل القيم اليمنى إلي ه . ثم يتم تدمير الكائن المؤقت و كل الذاكرة المخصصة ل ه ( ل تبسيط هذا النقاش تم إهمال عملية تحسين القيمة المرجعة ) . مشيد النقل move constractor في سي + + 11 للصنف <std : : vecto r<T و الذي يأخذ قيمة يمنى مرجعية من <std : : vecto r <T يمكن ه نسخ مؤشر المصفوفة الداخلية من القيمة اليمنى إلى الكائن <std : : vecto r <T الجديد ، ثم تغيير المؤشر داخل القيمة اليمنى إلى القيمة لا شيء ( N ull ) . و ب ما أن الكائن المؤقت لن يُستخدَم مرة أخرى أبدا ف ليس هناك أي أوامر س تحاول الوصول إلى ذلك المؤشر الداخلي ، و لأن المؤشر يشير على لا قيمة ف إن الذاكرة لن تُحذَف عند الخروج من مجال الدالة . و ب التالي ف إن هذه العملية لا تستغني عن نفقات النسخ العميق فقط لٰكن ها أيضا آمنة ومخفية . يمكن ل القيم اليمنى المرجعية أن توفر فوائد الأداء للأوامر البرمجية الموجودة دون الحاجة ل عمل أي تعديلات خارج المكتبة القياسية . نوع القيمة المرجعة من الدالة التي تعيد <std : : vecto r <T مؤقت لا تحتاج التغيير الصريح إلى & & <std : : vecto r <T ل استدعاء مشيد النقل ، حيث تعتبر المؤقتات قيم يمينية تلقائياً ( و مع ذلك إذا كان <std : : vecto r <T في ال إصدار سي + + 03 ب دون مشيد النقل ف س يتم استدعاء مشيد النسخ بـ & <const std : : vecto r <T مسبباً استهلاك مساحة كبيرة من الذاكرة ) . ل أسباب متعلقة ب السلامة ف قد تم فرض بعض القيود . فالمتغيرات المسماة لا يتم اعتبار ها أبداً قيمة يمينية ، حتى لو تم تعريف ها كذلك . وللحصول على قيمة يمينية ف يجب استخدام قالب الدالة ( ) std : : move . و لا يمكن تعديل القيم اليمنى المرجعية إلا في ظروف معينة ، حيث أن ها معدة ب شكل رئيسي ل الاستخدام مع مشيدات النقل . ب سبب طبيعة صياغة القيم اليمنى المرجعية و ب سبب بعض التعديلات في صياغة القيم ال يسرى المرجعية ( المراجع العادية ) ف إن القيم اليمنى المرجعية تسمح للمطورين ب توفير إعادة توجيه أفضل للدوال function forwarding . و عند الجمع مع القوالب متغيرة المعطيات variadic templates ف إن هذه القدرة تسمح للدوال ذات القوالب ب إعادة توجيه المعطيات لدالة أخرى يمكن ها أخذ تلك المعطيات . تعد الاستفادة الأكبر ل إعادة توجيه معطيات المشيد هي إنشاء دوال مُصنّعة factory functions و التي ستستدعي تلقائياً المشيد الصحيح ل تلك المعطيات . و قد تم رؤية ذلك في مجموعة emplace_back من دوال مكتبة سي + + القياسية . التعبيرات الثابتة المعممة - constexpr دائما ما كان لدى السي + + مفهوم التعبيرات الثابتة constant expression . هذه التعبيرات مثل 4 تعطي نفس النتيجة دائماً ، في وقت الترجمة compile time و في وقت التنفيذ run time . تعد التعبيرات الثابتة من فرص ا ل تحسين للمترجمات ، حيث تقوم المترجمات غلباً ب تنفيذ ها في وقت الترجمة و تضع النتيجة بدلاً من التعبير نفس ه في البرنامج . أيضا في كثير من الأماكن تتطلب مواصفات سي + + استخدام التعبيرات الثابتة . فتعريف مصفوفة يتطلب تعبير ثابت و قيم القائمة العددية enumerator يجب أن تكون تعبيرات ثابتة . و مع ذلك ف إن التعبيرات الثابتة لم تسمح أبداً ب استدعاء دالة أو مشيد لكائن . ل ذٰلك ف إن مجموعة الأوامر البسيطة التالية غير مقبولة : int get_five ( ) {return } int some_value [ get_five ( ) + ; / / إنشاء مصفوفة منعنصر ، غير مقبول في السي بلس بلس ذلك لم يكن مقبول في سي + + 03 لأن get_five ( ) + ليست تعبير ثابت . مترجم سي + + 03 لم يكن قادراً على معرفة ما إذا كان ( ) get_five ثابت فعلا في وقت التنفيذ . نظرياً هذه الدالة يمكن أن تؤثر على متغير كوني global variable أو استدعاء دوال أخرى غير ثابتة في وقت التنفيذ ، إلخ . قدمت سي + + 11 الكلمة المفتاحية constexpr و التي تسمح للمستخدم في وقت الترجمة أن يضمن أن الدالة أو مشيد الكائن ثابتاً . المثال السابق يمكن إعادة كتابة ه ك التالي : constexpr int get_five ( ) {return } int some_value [ get_five ( ) + ; / / إنشاء مصفوفة منعنصر ، مقبول في السي + + 11 هذا يسمح لل مترجم من الفهم و التأكد من أن ( ) get_five ثابتة وقت الترجمة . استخدام constexpr مع الدالة يفرض بعض القيود على ما يمكن للدلة أن تفعل ه . أولا يجب أن يكون نوع البيانات ال مرجع من الدالة غير فارغ void . ثانيا داخل جسم الدالة لا يمكن الإعلان عن متغيرات أو تعريف أنواع بيانات جديدة . ثالثا جسم الدالة يمكن فقط أن يحتوي على إعلانات أو جمل فارغة null وجملة إرجاع واحدة . يجب أن يتواجد قيم معطيات ب حيث أن ه بعد ابدال المعطيات ف إن التعبير في جملة ال إرجاع ينتج تعبير ثابت . قبل سي + + 11 كان يمكن استخدام قيم المتغيرات في التعبيرات الثابتة فقط إذا كانت المتغيرات معلن عن أن ها ثابتة بـconst و تم تهيئة ها بتعبير ثابت ونوع ها أرقم صحيحة أو قائمة عددية . في سي + + 11 تم حذف القيد المتعلق ب أن يكون نوع المتغيرات أرقام صحيحة أو قائمة عددية إذا تم تعريف ها ب استخدام الكلمة المفتاحية constexpr : constexpr double earth _gravitational_acceleration = 8; constexpr double moon_gravitational_acceleration = earth _gravitational_acceleration / 0 ;هذه المتغيرات ثابتة ضمنياً const و يجب أن تهيأ بتعبير ثابت . ل إنشاء قيم بيانات تعبير ثابت من أنواع بيانات معرفة من قبل المستخدم ف إن المشيدات يمكن أيضا الإعلان عن ها بـconstexpr . جسم دالة مشيد المعلن عن ه كتعبير ثابت يمكن أن يحتوى على إعلانات وجمل فارغة فقط ، و لا يمكن الإعلان عن متغيرات أو تعرف أنواع بيانات كما هو الحال مع الدوال المعلن عن ها بـconstexpr . يجب أن تتواجد قيم معطيات ب حيث أن ه بعد ابدال المعطيات ف إن تهيئة عناصر الصنف س ينتج تعبيرات ثابتة . المهدمات ل هٰذه الأنواع يجب أن تكون بسيطة . عادة يجب تعريف مشيد النسخ لصنف لدي ه مشيدات تعبيرات ثابتة ب أن يكون هو أيضا تعبير ثابت ، و ذٰلك ل السماح للكائنات من هذا صنف أن يتم إرجاع ها بالقيمة من دالة تعبير ثابت . يمكن الإعلان عن أي دالة عضو في الصنف مثل مشيدات النسخ والتحميلات الزائدة ل المعاملات و غير هم كتعبير ثابت طالما أن ها مستوفية ل شروط الدوال ثابتة التعبير . و هٰذا يسمح لل مترجم أن ينسخ الكائنات في وقت الترجمة و يؤدي العمليات علي هم ، إلخ . إذا تم استدعاء دالة أو مشيد تعبير ثابت بمعطيات غير ثابتة التعبير ، ف إن ال استدعاء يتصرف كما لو أن الدالة ليست تعبير ثابت ، و قيمة النتيجة لا تكون تعبير ثابت كذلك . ب المثل إذا كان تقييم التعبير في جملة ال إرجاع لدالة تعبير ثابت لا ينتج تعبيراً ثابتاً ف إن النتيجة لن تكون تعبير ثابت . تعديلات مكتبة سي + + القياسية تم إدخال عددا من الميزات الجديدة في المكتبة القياسية لسي + + 11 . العديد من ها يمكن تنفيذ ها تحت المعيار القديم ، لكن البعض يعتمد على الميزات الجديدة لل نواة في سي + + 11 . جزء كبير من المكتبات الجديدة تم تعريف ه في ملف التقرير الفني لمكتبة لجنة معايير السي + + ( يسمى التقرير الفنيأو اختصارا TR1 ) ، و الذي نُشِر في عام العديد من التنفيذات الكاملة والجزئية للتقرير متاحة حاليا ب استخدام النطاق الاسمي std : : tr1 . و قد تم نقل هم في سي + + 11 إلى النطاق الاسمي std . و مع ذلك فل إضافة ميزات التقرير الفني إلى المكتبة القياسية لسي + + 11 ف قد تم تحديث ها ب حيث تلائم ميزات لغة سي + + 11 و التي لم تكن متاحة عند الإصدارة المبدئية للتقرير الفني . و أيضا يمكن أن تكون محسنة مع الميزات الممكنة تحت سي + + 03 و لٰكن لم تكن جزء من المواصفات الأصلية للتقرير الفني . اللجنة تعتزم الآن عمل تقرير فني ثاني ( سيسمى التقرير الفنيأو اختصارا TR2 ) حيث اكتملت معايير سي + + 11 . اقتراحات المكتبة التي لم تكن جاهزة في وقت ها لسي + + 11 ستوضع في التقرير الفنيأو أي تقارير فنية إضافية . تحسين التوافق مع اللغة سي للتوافق مع اللغة سي ( من سي 99 ) تم إضافة التالي : Preprocessor : Headers : انظر أيضًا سي + + سي + + 03 المراجع وصلات خارجية The C + + Standards Committee C + + 0X : The New Face of Standard C + + Herb Sutter 's blog coverage of C + + 11 A nthony Williams ' blog coverage of C + + 11 A talk on C + + 0x given by Bjarne Stroustrup at the University of Waterloo The State of the Language : An Interview with Bjarne Stroustrup A ugust Wiki page to h elp keep track of C + + core language features and their availability in compilers Online C + + 11 standard library reference Online C + + 11 compiler Bjarne Stroustr u p 's C + + 11 FAQ سي + + عائلة لغة البرمجة سي + + معايير آي إي سي معايير الأيزو