"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > التحليل الأكثر إزعاجًا: Timer() - استدعاء كائن أم دالة؟

التحليل الأكثر إزعاجًا: Timer() - استدعاء كائن أم دالة؟

تم النشر بتاريخ 2024-12-21
تصفح:887

The Most Vexing Parse: Timer() - Object or Function Call?

التحليل الأكثر إزعاجًا: كشف الغموض في لغة 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 تم تمريره حسب المرجع.

  • إذا كان Timer () هو استدعاء دالة، فإن int يعلن time_keeper(Timer()) عن وظيفة تسمى time_keeper التي تأخذ كائن Timer كمدخل وترجع int.
  • إذا كان Timer() كائنًا من النوع Timer، فإن int time_keeper(Timer()) يعلن عن دالة تسمى time_keeper والتي تأخذ مؤشرًا إلى كائن Timer كمدخل وترجع int.

ومع ذلك، نظرًا لأن الوظائف تتحلل إلى مؤشرات عند تمريرها كوسيطات، فإن الدالة true نوع time_keeper هو int(Timer(*)())، والذي يحل الغموض لصالح تفسير المؤشر إلى الوظيفة.

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

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

Copyright© 2022 湘ICP备2022001581号-3