سؤال

وكما أفهم المعيار، المدمر تافهة واحد هو الذي أعلن ضمنيا والتي ليس لديها سوى قاعدة وأعضاء غير ثابت مع تالفة تافهة الصف. ونظرا لrecursivity من هذا التعريف، يبدو لي أن الشرط "، وقف العودية" الوحيدة هي العثور على قاعدة أو عضو غير ثابت مع المدمر أعلن غير ضمنيا (أي مستخدم أعلن). إذا كان هذا هو الحق، وهذا ينبغي أن يعني أن المدمر تافهة واحد هو الذي "لا تملك ان تفعل شيئا"، وبالتالي سيتم اعلان ذلك (ضمنا)، ولكن لم يتم تعريف. قائلا انها بطريقة أخرى: هل من الصحيح القول أن ضمنا <م> تعريف المدمر (أي "فإنه لا شيء") لا يمكن أن تكون تافهة وفقا للتعريف موحد

وعذرا لهذا النوع من سؤال سخيف، ولكن أود أن أوضح الأمور قليلا في رأسي ...

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

المحلول

ولا. و، المدمر تافهة يعرف ضمنا هو بالتعريف تافهة :) الفرق بين تعلن وتحديد ثينغي هو أنه من أجل المترجم لحتى يرى أن المدمر هو متاح، يجب دائما هناك إعلان. حتى إذا كنت لا توفر واحدة، فإنه سيتم توفير ضمنا واحد.

ولكن الآن، وسوف تحدد أيضا واحد، إذا ما هو مطلوب (إذا تم تدمير الهدف من هذا النوع من الدرجة). في أي حال، فإن عليها أن تفعل شيئا: إنه يحتاج إلى استدعاء تالفة من جميع أعضائها والفئات الأساسية. وهناك مثال بسيط الذي يوضح تأثير تحديد ضمنا المدمر:

struct a {
private:
    ~a();
};

struct bug {
    // note: can't be destructed
    a a_;
};

وبمجرد محاولة إنشاء كائن محلي من علة، فإن مترجم إشارة خطأ، لأنه ينتج تعريف المدمر لعلة، والذي يحاول الاتصال المدمر لا يمكن الوصول إليها من أ.

والآن، وأعتقد بتفاهة تالفة / الصانعين وتستخدم في الغالب لوضع قيود على البرنامج. كائنات وجود إصدارات غير تافهة منهم لا يمكن وضعها في النقابات، على سبيل المثال. على الجانب الآخر، يمكنك حذف كائن وجود نوع غير مكتملة، شريطة أن لديها المدمر تافهة. لاحظ أنه إذا كان البرنامج لا يمكن أن تقرر ما إذا كان تعريف المدمر تافهة في الواقع، يسمح للمترجم لحذف تحديده. هذا هو ما يسمى بقاعدة as-if. المترجم أن تتصرف متوافقة كما هو واذا كان القياسية - أمثل لا يهم طالما أنها لا تغير معنى البرنامج.

نصائح أخرى

وصياغة الخاص بك هو مؤسف قليلا. مثلا العودية بالطبع ينتهي أيضا عند نفاد الأعضاء والفئات الأساسية. يبدو هذه المشاكل الصياغة أيضا لتحصل على مزيد من الخلط.

وعلى أي حال، كل تالفة أعلن ضمنيا، سواء كانت تافهة أو لا، وتعرف إذا وفقط إذا تم استخدامها. مستعمل هو مصطلح محدد هنا. A المدمر من نوع T هو <م> تستخدم كلما عمر كائن T ينتهي.

توجد

وتالفة تافهة لC المبرمجين وضع البنيات في النقابات. هذا الرمز يجب remian قانوني في C ++، لذلك اخترع فكرة وجود المدمر تافهة لC ++. كل البنيات C تالفة لتافهة، عندما جمعت كما C ++.

والنظر في هاتين الطبقتين:

class A {
};

class B {
private:
     A obj;
};

ووتالفة من كل من هذه الفئات المحددة ضمنا. ومع ذلك، وفي نفس الوقت، كلاهما تافهة من تعريف موحد.

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