سؤال

خذ بعين الاعتبار الكود التالي:

#include <iostream>

typedef int t;
t a=42;

int main()
{
    a.t::~t();
    std::cout << a; //42
}

أنا أتوقع ذلك a سيتم تدميرها.ولكن هذا غير صحيح، لماذا؟كيف سيتم تدمير الكائن باستدعاء المدمر الزائف؟

هل كانت مفيدة؟

المحلول

ولكن هذا غير صحيح، لماذا؟

§5.2.4/1:

التأثير الوحيد هو تقييم تعبير postfix قبل النقطة أو السهم.

حيث يكون تعبير postfix هو التعبير عن الكائن الذي يتم الاستدعاء من أجله.وبالتالي، فإن استدعاء أداة التدمير الزائفة، كنداء إلى أداة تدمير تافهة، لا ينهي عمر الكائن الذي يتم تطبيقه عليه.على سبيل المثال،

int i = 0;
(i += 5).~decltype(i)();
std::cout << i;

لا يمكنك في الواقع استدعاء أداة تدمير للوحدات العددية، لأنها لا تحتوي على واحدة (انظر [class.dtor]).يُسمح بالعبارة فقط لرمز القالب الذي تستدعي فيه أداة التدمير لكائن لا تعرف نوعه - فهو يلغي ضرورة كتابة تخصص للأنواع العددية.


تمت الإشارة في التعليقات إلى أن [expr.pseudo] يشير ضمنًا إلى وجود مُدمر للكميات العددية بواسطة

استخدام أ اسم مدمر زائف بعد نقطة . أو السهم -> يمثل المشغل المدمر لنوع غير الطبقة المسمى بواسطة أكتب اسم.

ومع ذلك، فإن هذا لا يتوافق مع الأجزاء الأخرى من المعيار، على سبيل المثال.§12، الذي يدعو المدمر إلى وظيفة عضو خاصة ويذكر ذلك

يتم استخدام المدمر لتدمير الكائنات من نوع فئتها.

يبدو أنه تم إنشاء خطأ في C++ 98 يومًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top