يستخدم C ++ لعدم التفكير في التحكم في الوصول عند استئصال القوالب ، باستثناء أن ينتج خطأ إذا لزم الأمر. لا يزال المترجم الذي تستخدمه يستخدم هذه القواعد. ولهذا السبب ، لا يعتبر فصلك غير قابل للتقرير. بدلاً من ذلك ، فإن الشيك نفسه مستحيل.
GCC 4.8 وأعلى دعم هذا. برنامج عرضي بسيط ينجح بـ 4.8 ، ويفشل بـ 4.7 هو:
#include <type_traits>
class S { S() {} };
int main() {
return std::is_default_constructible<S>::value;
}
في 4.8 ، يعود هذا 0. في 4.7 ، وهذا ينتج خطأ في وقت الترجمة.
لحل هذا ، تأكد من عدم وجود مُنشئ افتراضي ، ولا حتى منشئ خاص. يمكنك إضافة وسيطة وهمية إلى مُنشئك ، والتأكد من تمرير هذه الوسيطة الوهمية دائمًا.