Вопрос

Добавить 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top