"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تفشل Microsoft Visual C ++ في تنفيذ إنشاء مثيل للقالب ثنائي المراحل بشكل صحيح؟

لماذا تفشل Microsoft Visual C ++ في تنفيذ إنشاء مثيل للقالب ثنائي المراحل بشكل صحيح؟

نشر في 2025-02-06
تصفح:875

Why Does Microsoft Visual C   Fail to Correctly Implement Two-Phase Template Instantiation?

تعبر عن المخاوف من أن Microsoft Visual C (MSVC) تكافح من خلال تنفيذ مثيل للقالب ثنائي الطور بشكل صحيح. ما هي الجوانب المحددة للآلية تفشل في العمل كما هو متوقع؟ ومع ذلك ، تنشأ الشكوك فيما يتعلق بما إذا كان هذا الشيك يتحقق مما إذا كان يتم الإعلان عن الأسماء المستخدمة في القوالب بشكل مناسب. فشل في التحقق من وجود أسماء معلنة ، مما يؤدي إلى مشكلات التجميع عندما تفتقر الأسماء إلى الإعلانات المناسبة.

لتوضيح ذلك ، فكر في المثال التالي:

قالب struct s { s () {int i = foo (0) ؛ } } ؛ void foo (int) ؛ int main () { s s ؛ }

من شأن المترجم المتوافق مع المعيار حل استدعاء FOO (0) أثناء المرحلة الأولى وربطه بـ foo (void*). ومع ذلك ، تقوم MSVC بتأجيل هذه العملية إلى المرحلة الثانية ، وربط FOO (0) بشكل غير صحيح بـ FOO (int) وينتج عن خطأ.

علاوة :

التي تكون مرئية فقط خلال المرحلة الثانية.

مساحة الاسم n { هيكل s {} ؛ } شريط void (void *) {} قالب & lt ؛ typename t & gt ؛ void foo (t *t) { شريط (t) ؛ } شريط void (n :: s *s) {} int main () { n :: s ؛ foo (& amp ؛ s) ؛ }

في كلتا الحالتين ، يخالف سلوك MSVC الفصل المحدد بين المرحلتين الأولى والثانية من إنشاء إنشاء القالب. يستمر هذا التنفيذ غير الصحيح في Visual Studio 2015.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3