Разве небезопасно смешивать статическое и переосмысление приведения при приведении к пустоте * и обратно?

Просто: если я 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 годом. Однако это, скорее всего, неопределенное поведение. Правильно?

2

Решение

Это четко определено. В соответствии с ИСО / МЭК 14882: 2011 [expr.reinterpret.cast] §7 (выделено мной):

Указатель объекта может быть явно преобразован в указатель объекта
другой тип. Когда значение v типа «указатель на T1» равно
преобразован в тип «указатель на резюме Т2 », результат static_cast<резюме
T2 *>(static_cast<резюме недействительным *>(V))
если оба T1 и T2 являются стандартным макетом
типы (3.9) и требования к выравниванию T2 не более строгие, чем
те из T1, или если любой тип является недействительным.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]