const_cast по сравнению с static_cast

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

11
задан curiousguy 20 December 2011 в 21:31
поделиться

4 ответа

Не используйте ни то, ни другое. Инициализируйте 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 следует использовать только для отбрасывания константности, потому что это единственный способ отбрасывания, который может это сделать, а отбрасывание константности по своей природе опасно. Изменение объекта через указатель или ссылку, полученную путем отбрасывания константности, может привести к неопределенному поведению.

14
ответ дан 3 December 2019 в 05:56
поделиться

Я бы сказал, что static_cast предпочтительнее, поскольку он позволит вам выполнять приведение только из не const в const (что безопасно), но не в другом направлении (что не обязательно безопасно).

3
ответ дан 3 December 2019 в 05:56
поделиться

Это хороший вариант использования шаблона функции implicit_cast .

2
ответ дан 3 December 2019 в 05:56
поделиться

Вы можете написать свой собственный состав:

template<class T>
const T & MakeConst(const T & inValue)
{
    return inValue;
}
1
ответ дан 3 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: