Подтвердить что ты не робот

Const_cast vs static_cast

Чтобы добавить const к объекту non-const, который является предпочтительным методом? const_cast<T> или static_cast<T>. В недавнем вопросе кто-то сказал, что они предпочитают использовать static_cast, но я бы подумал, что const_cast сделает код более понятным. Итак, что аргумент для использования static_cast для создания переменной const?

4b9b3361

Ответ 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;
}