reinterpret_cast

Ответить
Аватара пользователя
bilytur

reinterpret_cast

Сообщение bilytur »

Зачем он нужен понятно, к примеру указатель в int конвертнуть:

char *p;

int v = reinterpret_cast(p);



Но то-же самое можно сделать и просто:

int v = (int)(p);



Так зачем писать такое длинное слово?

Приведите пример в котором reinterpret_cast работает

а простой "cast" нет.
Аватара пользователя
hasherfrog

Re: reinterpret_cast

Сообщение hasherfrog »

На мой взгляд, имеет смысл рассматривать данный оператор только вместе с остальными (dinamic_cast и т.д.). Его использование убирает некоторую неоднозначность, даёт точно понять, что программер хотел получить проcто биты (от машинного адреса).



Код:

Код: Выделить всё

class A; 
class B : public A; 
A a; 
B* b = (B*)&a; <-- фиг его знает, чего надо: то ли адрес как класса А, то ли как В (хотя вероятно, что имелось в виду приведение полиморфных типов) 
B* b = reinterpret_cast<B>(&a);  <-- понятно, нужен адрес а как класса А (хотя мы явно нарываемся на ошибку, для использования методов А надо делать dinamic_cast)

Могу ошибаться, впрочем... Поправьте, если что.
Аватара пользователя
bilytur

Re: reinterpret_cast

Сообщение bilytur »

Ну вобщем как я понял, обычное приведение типа

int v = (int)(p); можно считать "тяжелым" наследием С.

А С++ введя кучу всякой всячины, dinamic_cast и пр. и пр. для единообразия ввел и reinterpret_cast.

Хотя особой нужды в нем видимо нет.

Спасибо за разъяснение.
Аватара пользователя
bilytur

Re: reinterpret_cast

Сообщение bilytur »

bilytur

reinterpret_cast не снимает константности, в отличие от сишного приведения. Для этого есть const_cast, который изредка даже оправдан в использовании. А вообще, любые приведения помимо автоматических - вредны по определению.

Код:

Код: Выделить всё

int main()
{
	const int * a(0x0);
	int * b;
	b = (int*)a; // не ругается
	b = reinterpret_cast(a); // ругается
	return 0;
}
Аватара пользователя
bilytur

Re: reinterpret_cast

Сообщение bilytur »

На счет константности не знал, спасибо.
Ответить

Вернуться в «Программирование и базы данных»