التحليل الأكثر إزعاجًا: كشف الغموض في لغة C 11
يظهر الغموض "الأكثر إزعاجًا" في لغة C 11 عند استخدام مُهيئات موحدة، كما هو موضح في مقتطف الكود التالي:
#include
class Timer
{
public:
Timer() {}
};
int main()
{
auto dv = Timer(); // Ambiguity: Object or function call?
int time_keeper(Timer()); // Ambiguity: Pointer or call?
return 0;
}
فهم التعبير الأول (auto dv = Timer())
في التعبير الأول، تشير الكلمة الأساسية auto إلى أنه يتم استنتاج نوع dv من المُهيئ على الجانب الأيمن من علامة المساواة (=). المُهيئ عبارة عن استدعاء لمنشئ Timer بدون وسائط، والذي يقوم بإرجاع كائن Timer. لذلك، dv هو كائن من النوع Timer.
فهم التعبير الثاني (int time_keeper(Timer()))
في التعبير الثاني، ينشأ الغموض بسبب لا يمكن للمترجم تحديد ما إذا كان Timer() عبارة عن استدعاء دالة أو كائن من النوع Timer تم تمريره حسب المرجع.
ومع ذلك، نظرًا لأن الوظائف تتحلل إلى مؤشرات عند تمريرها كوسيطات، فإن الدالة true نوع time_keeper هو int(Timer(*)())، والذي يحل الغموض لصالح تفسير المؤشر إلى الوظيفة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3