2013-10-10 2 views
11

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

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

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

заменить

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

?

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

Хонг

+1

Я подозреваю, что это необходимо для правильной совместимости/стандартного соответствия, потому что результат 'reinterpret_cast' не указан в стандарте. На практике они, вероятно, делают то же самое во всех или почти во всех реализациях. –

+2

Эти два эквивалента в C++ 11. – Simple

+0

@SteveJessop: Я думаю, что это ответ. –

ответ

5

В соответствии со стандартом (§ 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» к типу «указатель на Т2» (где T1 и T2 являются типами объектов, и где требование выравнивания T2 не является более жестким, чем у T1) и обратно к его оригинальный тип дает исходное значение указателя. Результат любого другого преобразования указателя не задан.

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

  1. reinterpret_cast<*T>(ptr) является eqiuvalent к static_cast<*T>(static_cast<void*>(ptr))
  2. static_cast<>(ptr) не всегда равна ptr, но reinterpret_cast<>(ptr) всегда равна ptr
  3. если нет проблем с выравниванием, мы можем использовать reinterpret_cast безопасно
Смежные вопросы