عند استخدام قالب الوظيفة std::، هناك غموض يمكن أن تنشأ بسبب الأحمال الزائدة المتعددة المعقولة. على وجه التحديد، خذ بعين الاعتبار مقتطف الكود التالي:
#include
using namespace std;
int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
}
ينبع الغموض من حقيقة أنه يمكن إنشاء كل من الدالة
يعتبر توقيع وسيطة القالب لـ std::function جزءًا من نوعه أثناء الإعلان والتعريف. ومع ذلك، ليس هذا هو الحال أثناء إنشاء الكائن.
std::function، مثل العديد من الكائنات الوظيفية في لغة C، تستخدم تقنية تسمى محو النوع. وهذا يمكّنه من قبول كائنات أو وظائف عشوائية، طالما أنها تلبي التوقيع المتوقع عند استدعائها. الجانب السلبي هو أن الأخطاء المتعلقة بالتوقيعات غير المتطابقة تحدث في عمق التنفيذ، وليس على مستوى المنشئ.
توجد ثلاثة خيارات أساسية للتحايل على هذا الغموض:
بينما تحدد وسيطة القالب الخاصة بـ std::function نوعها أثناء الإعلانات والتعريفات، ولا تلعب أي دور في بناء الكائن. يمكن أن يؤدي هذا إلى الغموض عندما يقبل المنشئون حججًا عشوائية. لحل هذه المشكلة، يمكن للمبرمجين استخدام النوع الصريح، أو التفاف كائن الوظيفة، أو TMP.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3