سؤال

مسودة العمل يدعو صراحة ذلك الوظائف الافتراضية يجب أن تكون وظائف الأعضاء الخاصة (على سبيل المثال نسخ البناء ، والبناء الافتراضي ، وما إلى ذلك ، (§8.4.2.1-1)). وهو أمر منطقي تمامًا.

ومع ذلك ، لا أرى أي قيود من هذا القبيل على تم حذف الوظائف(§8.4.3). هل هذا صحيح؟

أو بعبارة أخرى ، هذه الأمثلة الثلاثة صالحة c++0?

struct Foo
{
   // 1
   int bar( int ) = delete;
};


// 2
int baz( int ) = delete;


template< typename T >
int boo( T t );

// 3
template<>
int boo<int>(int t) = delete;
هل كانت مفيدة؟

المحلول

لا تنكر المواصفات C ++ 0x (§ [dcl.fct.def.delete]) مثل هذه التركيبات ، و G ++ 4.5 التعرف على جميعها 3.

x.cpp: In function 'int main()':
x.cpp:4:8: error: deleted function 'int Foo::bar(int)'
x.cpp:21:11: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:2: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:8: error: used here
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]'
x.cpp:23:7: error: used here

نصائح أخرى

أعتقد أنهم جميعًا على ما يرام.

= delete جيد لضمان عدم استخدام الحمل الزائد (الفقرة 8.4.3/2) ، وهو أمر مفيد خارج الطبقات.

الآن بعد 5 أشهر أنظر إلى الإجابات الأخرى ... delete ليس فقط مفيدًا للوظائف ذات التعاريف الضمنية. إنه البديل النظيف للتعليق الذي يقول "لا يوجد تنفيذ - استخدام هذا خطأ في الارتباط." إنه يوفر طريقة واضحة لعدم تنفيذ شيء ما ، على سبيل المثال قالب أساسي حيث توجد تخصصات صريحة فقط بالفعل. سوف يشكو المترجم قبل وقت الارتباط.

على سبيل المثال غريب بعض الشيء ، ولكن معقول تمامًا ، فكر

class abc {
protected:
    inline virtual ~abc() = 0;
    inline virtual void do_something() = 0;
};

abc::~abc() {}
void abc::do_something = delete;

كلاهما = 0 و = delete يمكن استخدامها في نفس الوظيفة. بدون = delete, ، يمكن للمستخدم تقديم مكالمة مجاملة عرضية إلى abc::do_something().

لن أتفاجأ إذا أضاف التكرار التالي لـ C ++ بعد C ++ 0x فئات محذوفة بشكل صريح.

من ما أفهمه من تعريف وظائف الأعضاء "المحذوفة" ، هو أنه ينطبق فقط على وظائف الأعضاء الخاصة (المُنشئ ، النسخ ، المهمة) التي يمكن إنشاؤها تلقائيًا من قبل المترجم وعدم وظائف الأعضاء العادية (والتي لا معنى لها في جميع المنظمة البحرية الدولية ، لإعلان الوظائف التي يتم "حذفها" ، لذلك فقط لا تعلن عنها على أي حال)

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