مقارنة التكرارات من حاويات مختلفة: حكاية تحذيرية
في لغة C، توفر التكرارات آلية قوية لاجتياز المجموعات. ومع ذلك، من المهم أن تكون على دراية بالقيود عند استخدام التكرارات من حاويات مختلفة.
يُطرح السؤال حول ما إذا كان من القانوني مقارنة التكرارات من حاويات مختلفة بشكل متكرر. خذ بعين الاعتبار المثال التالي:
std::vector foo;
std::vector bar;
std::cout قد يبدو هذا التعبير غير ضار للوهلة الأولى، لكنه في الواقع يؤدي إلى سلوك غير محدد. وفقًا لمعيار C 11، لا يمكن مقارنة التكرارات إلا إذا كانت تشير إلى عناصر من نفس التسلسل. نظرًا لأن foo وbar هما متجهان مختلفان، فإن التكرارات الخاصة بهما غير قابلة للمقارنة.
تم التأكيد على هذا السلوك بشكل أكبر في إصدار LWG رقم 446:
"نتيجة التقييم المباشر أو غير المباشر لأي وظيفة مقارنة أو العامل الثنائي - الذي يحتوي على قيمتين مكررتين كوسيطتين تم الحصول عليهما من نطاقين مختلفين r1 وr2 (...) وهما ليسا نطاقات فرعية لنطاق مشترك واحد، غير محدد، ما لم يتم وصف خلاف ذلك صراحة. له آثار كبيرة على تنفيذ التكرارات المخصصة. إذا كنت تخطط لتنفيذ عامل التشغيل== لمكررك المخصص، فيجب عليك التأكد من أنه يقارن فقط التكرارات الموجودة ضمن نفس النطاق.
قد يؤدي الفشل في الالتزام بهذه القاعدة إلى سلوك غير متوقع وهو ضار في النهاية لموثوقية التعليمات البرمجية الخاصة بك. لذلك، من المهم أن نأخذ في الاعتبار أن مقارنة التكرارات من حاويات مختلفة محظور تمامًا في لغة C .
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3