const_cast vs static_cast
-
25-09-2019 - |
سؤال
لإضافة 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;
}