const_cast vs static_cast.
-
25-09-2019 - |
Вопрос
Добавить const
на объект без константа, который является предпочтительным методом? const_cast<T>
или static_cast<T>
. Отказ В недавнем вопросе кто-то упомянул, что они предпочитают использовать static_cast
, но я бы подумал, что const_cast
сделает намерение коду более понятно. Так какой аргумент для использования static_cast
сделать переменную 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
(который безопасен), а не в другом направлении (который не обязательно безопасен).
Это хорошее использование для imployit_cast. Функциональный шаблон.
Вы можете написать свой собственный актеров:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}