Просто: если я static_cast
тип X*
в void*
Всегда ли безопасно reinterpret_cast
это обратно к X *?
Я не могу привести ни одного случая, когда это не удается, например:
#include <iostream>
struct a
{
int* m_array;
};
int main()
{
bool fail = false;
for(int i = 0; ++i < 5000;)
{
a* pA = new a;
pA->m_array = new int [i+1]; // A new size of data everytime
pA->m_array[i] = 10;
void* pvA = static_cast<void*>(pA);
pA = reinterpret_cast<a*>(pvA);
if(pA->m_array[i] != 10)
{
fail = true;
break;
}
delete []pA->m_array;
delete pA;
}
if(fail)
std::cout<<"FAILED!!";
else
std::cout<<"Never failed :/";
}
Ссылка на скомпилированный пример
Дает результат «Никогда не было ошибок: /» в режиме отладки и выпуска по сравнению с 2012 годом. Однако это, скорее всего, неопределенное поведение. Правильно?
Это четко определено. В соответствии с ИСО / МЭК 14882: 2011 [expr.reinterpret.cast] §7 (выделено мной):
Указатель объекта может быть явно преобразован в указатель объекта
другой тип. Когда значение v типа «указатель на T1» равно
преобразован в тип «указатель на резюме Т2 », результат static_cast<резюме
T2 *>(static_cast<резюме недействительным *>(V)) если оба T1 и T2 являются стандартным макетом
типы (3.9) и требования к выравниванию T2 не более строгие, чем
те из T1, или если любой тип является недействительным.
Других решений пока нет …