int OffsetType();
short GetType(void *p)
{
return *(static_cast<short *>(static_cast<char *>(p) + OffsetType()));
}
здесь не компилится
error C2440: 'static_cast' : cannot convert from 'char *' to 'short *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Что для преобразования из char * в short * надо использовать reinterpret_cast ?
А так компилится
int OffsetType();
short GetType(void *p)
{
return *((short *)((char *)p + OffsetType()));
}
PS Может я просто не умею готовить кошек?
Здравствуйте, Кирпа В.А., Вы писали:
КВА>Что для преобразования из char * в short * надо использовать reinterpret_cast ?
Именно. Т.к. такое преобразование небезопасно с точки зрения дальнейшего использования полученного указателя.
КВА>А так компилится
КВА>КВА>int OffsetType();
КВА>short GetType(void *p)
КВА>{
КВА> return *((short *)((char *)p + OffsetType()));
КВА>}
КВА>
C-style program, однако. Компилятор думает, что ты ему подсунул старый сишный код
КВА>PS Может я просто не умею готовить кошек?
А кто умеет?
... << RSDN@Home 1.1.2 stable >>
Я же только что целый опус написал по данному вопросу...
Здравствуйте, Кирпа В.А., Вы писали:
КВА>Что для преобразования из char * в short * надо использовать reinterpret_cast ?
Разумеется.
КВА>А так компилится
КВА>КВА>int OffsetType();
КВА>short GetType(void *p)
КВА>{
КВА> return *((short *)((char *)p + OffsetType()));
КВА>}
КВА>
Это и будет аналог 'reinterpert_cast'
К> Я правильно понимаю, что c-style cast — это компилятор
К> последовательно пробует сделать function cast, static_cast,
К> а если не получилось — то reinterpret_cast ?
Почти.
function cast с одним аргументом определяется как раз через c-style cast, поэтому его, вообще, рассматривать не стоит.
const_cast, static_cast, reinterpret_cast а также их комбинации применяются в следующем порядке:
const_cast
static_cast
static_cast + const_cast
reinterpret_cast
reinterpret_cast + const_cast
Кроме того, в отличие от static_cast и reinterpret_cast, с помощью c-style cast можно приводить без соблюдения "прав доступа":
указатель/lvalue унаследованного класса — к указателю/ссылке базового класса:
struct B { };
struct D : private B { };
D d;
B* bp = (B*)&d;
B& br = (B&)d;
указатель на член унаследованного — к указателю на член базового:
struct B { };
struct D : private B { int j; };
int B::* bmp = (int B::*)&D::j;
указатель на член базового — к указателю на член унаследованного:
struct B { int i; };
struct D : private B { };
int D::* dmp = (int D::*)&B::i;
При необходимости в этих случаях также будет применен const_cast.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен