Чтобы добавить const
к объекту non-const, который является предпочтительным методом? const_cast<T>
или static_cast<T>
. В недавнем вопросе кто-то сказал, что они предпочитают использовать static_cast
, но я бы подумал, что const_cast
сделает код более понятным. Итак, что аргумент для использования static_cast
для создания переменной const?
Const_cast vs static_cast
Ответ 1
Не используйте. Инициализировать ссылку на const, которая ссылается на объект:
T x;
const T& xref(x);
x.f(); // calls non-const overload
xref.f(); // calls const overload
Или используйте шаблон функции implicit_cast
, например тот, который указан в Boost:
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
следует использовать только для того, чтобы отбросить константу, потому что это единственный актер, который может это сделать, и отбрасывание константы по своей сути опасно. Изменение объекта с помощью указателя или ссылки, полученной путем отбрасывания константы, может привести к поведению undefined.
Ответ 2
Я бы сказал, что static_cast
предпочтительнее, поскольку он позволит вам отбрасывать только от const
до const
(что безопасно), а не в другом направлении (что не обязательно безопасно).
Ответ 3
Это хороший прецедент для шаблона функции implicit_cast.
Ответ 4
Вы можете написать свой собственный бросок:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}