Добавить 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
шаблон функции, как тот, что предоставлен в 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
следует использовать только для отбрасывания константности, потому что это единственный способ отбрасывания, который может это сделать, а отбрасывание константности по своей природе опасно. Изменение объекта через указатель или ссылку, полученную путем отбрасывания константности, может привести к неопределенному поведению.
Я бы сказал, что static_cast
предпочтительнее, поскольку он позволит вам выполнять приведение только из не const
в const
(что безопасно), но не в другом направлении (что не обязательно безопасно).
Это хороший вариант использования шаблона функции implicit_cast .
Вы можете написать свой собственный состав:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}