приведение от T1 * к несвязанному T2 * с reinterpret_cast не менее определено, чем с static_cast.На самом деле, когда T1 и T2 являются стандартными типами макетов, они работают одинаково (см. 5.2.10 / 7):
Когда значение типа v указателя на T1 преобразуется в тип «указатель на cv T2 ”, результат static_cast(static_cast(v))
Для нестандартных типов макетов результат преобразования не определен, но он также не указан для static_cast.
Полагаю, разницу можно получить только тогда, когдаприведение типов без указателей в искусственных случаях, таких как:
struct Foo
{
};
struct Bar
{
operator void*()
{
return 0;
}
};
int main ()
{
Bar b;
Foo * p1 = static_cast<Foo*>(static_cast<void *>(b)); // ok, Bar::operator void* -> static_cast
Foo * p2 = reinterpret_cast<Foo*>(b); // error, no conversion from Bar to Foo*.
}