const_cast vs static_cast - PullRequest
       41

const_cast vs static_cast

11 голосов
/ 04 августа 2010

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

Ответы [ 4 ]

14 голосов
/ 04 августа 2010

Не используйте тоже.Инициализируйте константную ссылку, которая ссылается на объект:

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

2 голосов
/ 04 августа 2010

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

2 голосов
/ 04 августа 2010

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

1 голос
/ 04 августа 2010

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

template<class T>
const T & MakeConst(const T & inValue)
{
    return inValue;
}
...