Static_cast и reinterpret_cast для std:: aligned_storage

может кто-нибудь объяснить бит кода о литье в http://en.cppreference.com/w/cpp/types/aligned_storage, пожалуйста?

может быть следующий код

return *static_cast<const T*>(static_cast<const void*>(&data[pos]));

заменить на

 return *reinterpret_cast<const T*>(&data[pos]);

?

Почему здесь используются две отливки? Большое спасибо.

Hong

Ответ 1

Согласно стандарту (§ 5.2.10 reinterpret_cast, раздел 7):

Указатель на объект может быть явно преобразован в указатель на отдельный тип объекта. Когда prvalue v типа "указатель на T1" преобразуется в тип "указатель на cv T2", результат static_cast<cv T2*>(static_cast<cv void*>(v)) , если оба T1 и T2 являются стандартными макетами типы и требования к выравниванию T2 не более строгие, чем требования T1.

Преобразование prvalue типа "указатель на T1" в тип "указатель на T2" (где T1 и T2 - это типы объектов, а требования к выравниванию T2 не более строгие, чем требования к T1) и обратно к исходному типу дает исходное значение указателя. Результат любого другого такого преобразования указателя не определен.

Итак, мы могли бы сделать следующий вывод:

  • reinterpret_cast<*T>(ptr) является эквивалентным для static_cast<*T>(static_cast<void*>(ptr))
  • static_cast<>(ptr) не всегда равен ptr, но reinterpret_cast<>(ptr) всегда равен ptr
  • Если нет проблем с выравниванием, мы можем безопасно использовать reinterpret_cast