سؤال

لإضافة const إلى كائن غير محكم ، ما هي الطريقة المفضلة؟ const_cast<T> أو static_cast<T>. في سؤال حديث ، ذكر شخص ما أنهم يفضلون استخدامه static_cast, ، لكنني كنت أعتقد ذلك const_cast من شأنه أن يجعل نية الكود أكثر وضوحا. إذن ما هي الحجة لاستخدامها static_cast لجعل متغير const؟

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

المحلول

لا تستخدم أيضًا. تهيئة مرجع const الذي يشير إلى الكائن:

T x;
const T& xref(x);

x.f();     // calls non-const overload
xref.f();  // calls const overload

أو ، استخدم implicit_cast قالب الوظيفة ، مثل تلك المقدمة في التعزيز:

T x;

x.f();                           // calls non-const overload
implicit_cast<const T&>(x).f();  // calls const overload

بالنظر إلى الاختيار بين static_cast و const_cast, static_cast من الأفضل بالتأكيد: const_cast يجب أن تستخدم فقط ل منبوذ القدة لأنه الممثل الوحيد الذي يمكنه القيام بذلك ، والاستفادة من القدة أمر خطير بطبيعته. قد يؤدي تعديل كائن عبر مؤشر أو مرجع تم الحصول عليه عن طريق إبعاد القدة إلى سلوك غير محدد.

نصائح أخرى

أريد أن أقول static_cast من الأفضل لأنه سيسمح لك فقط بالالتفاف من غيرconst ل const (وهو آمن) ، وليس في الاتجاه الآخر (وهو ليس آمنًا بالضرورة).

هذه حالة استخدام جيدة ل ضمنيا قالب الوظيفة.

يمكنك كتابة الممثلين الخاص بك:

template<class T>
const T & MakeConst(const T & inValue)
{
    return inValue;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top