PDA

Показать полную графическую версию : reinterpret_cast


bilytur
05-05-2004, 03:36
Зачем он нужен понятно, к примеру указатель в int конвертнуть:
char *p;
int v = reinterpret_cast<int>(p);

Но то-же самое можно сделать и просто:
int v = (int)(p);

Так зачем писать такое длинное слово?
Приведите пример в котором reinterpret_cast работает
а простой "cast" нет.

hasherfrog
05-05-2004, 09:05
На мой взгляд, имеет смысл рассматривать данный оператор только вместе с остальными (dinamic_cast и т.д.). Его использование убирает некоторую неоднозначность, даёт точно понять, что программер хотел получить проcто биты (от машинного адреса).
class A;
class B : public A;
A a;
B* b = (B*)&a; <-- фиг его знает, чего надо: то ли адрес как класса А, то ли как В (хотя вероятно, что имелось в виду приведение полиморфных типов)
B* b = reinterpret_cast<B>(&a);  <-- понятно, нужен адрес а как класса А (хотя мы явно нарываемся на ошибку, для использования методов А надо делать dinamic_cast)
Могу ошибаться, впрочем... Поправьте, если что.

bilytur
06-05-2004, 03:03
Ну вобщем как я понял, обычное приведение типа
int v = (int)(p); можно считать "тяжелым" наследием С.
А С++ введя кучу всякой всячины, dinamic_cast и пр. и пр. для единообразия ввел и reinterpret_cast.
Хотя особой нужды в нем видимо нет.
Спасибо за разъяснение.

ivank
07-05-2004, 02:03
bilytur
reinterpret_cast не снимает константности, в отличие от сишного приведения. Для этого есть const_cast, который изредка даже оправдан в использовании. А вообще, любые приведения помимо автоматических - вредны по определению.int main()
{
const int * a(0x0);
int * b;
b = (int*)a; // не ругается
b = reinterpret_cast<int*>(a); // ругается
return 0;
}

bilytur
07-05-2004, 04:06
На счет константности не знал, спасибо.




© OSzone.net 2001-2012