2011-01-20 8 views
5

W C++ bez obaw: a przewodnik dla początkujących sprawia, że ​​czujesz Inteligentny książkę, oraz w rozdziale (8), wymienia następujące informacje reinterpret_castreinterpret_cast

.... Konwersja z jednego rodzaju wskaźnik (int) do innego (znak *). Ponieważ obsada zmienia sposób interpretacji wskazanych danych, jest nazywana reinterpret_cast, w przeciwieństwie do static_cast. *

Czy możesz opisać ten akapit tutaj? Zwłaszcza powód, dla którego nazwa operacji została nazwana?

Dzięki.

+3

To świetne imię dla książki! – Joe

+0

Było jeszcze jedno pytanie, które wyszło z tej książki, i skończyło się na robieniu czegokolwiek, ale sprawienie, że OP będzie inteligentny. –

+0

Ah, hah, to byłeś ty. http://stackoverflow.com/questions/4746980/c-quitting-a-program Wstyd, że zdecydowałeś nie brać mojej rady o uzyskanie prawdziwego. –

Odpowiedz

6

Zasadniczo reinterpret_cast reinterpretuje wzór bitowy w określonej lokalizacji jako inny typ.

Zobacz na przykład tutaj: „Operator reinterpret_cast wytwarza wartość nowego typu, który ma ten sam wzór bitowy jako argument” http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc05keyword_reinterpret_cast.htm

Rzut statyczny konwertuje argument zamiast go tylko reinterpretować. Możesz wypróbować to przez static_casting i int float i reinterpret_casting int do float. Wynik będzie zupełnie inny.

+3

Nie musi mieć tego samego wzoru bitowego. Istnieje niewiele gwarancji na 'reinterpret_cast' w standardzie. 5.2.10/3 mówi "Mapowanie wykonywane przez' reinterpret_cast' jest zdefiniowane przez implementację. [Uwaga: może, ale nie musi, wygenerować reprezentację inną niż oryginalna wartość.] "Ponadto' reinterpret_cast' nie może rzutować '. int' to a 'float' (może rzutować' int * 'na' float * '). Każda implementacja, która wykonuje tę obsadę, jest niezgodna ze Standardem (5.2.10/1, ostatnie zdanie), mimo że prawdopodobnie jest dość powszechnym rozszerzeniem. –

4

Nic wyszukanego. to naprawdę ma na celu ponowne zinterpretowanie czegoś.

Od standardowego 5.3.10, reinterpret_cast jest skierowany do zaspokojenia następujących przypadkach:

  • Wskaźnik może być jawnie zamienione na każdej integralnej typu wystarczająco duża, aby ją utrzymać.
  • Wartość typu całkującego lub typu wyliczeniowego można jawnie przekonwertować na wskaźnik.
  • Wskaźnik do funkcji można jawnie przekonwertować na wskaźnik na funkcję innego typu.
  • Wskaźnik do obiektu można jawnie przekonwertować na wskaźnik na inny typ obiektu.
  • Konwersja wskaźnika do funkcji na wskaźnik na typ obiektu lub odwrotnie jest obsługiwana warunkowo.
  • Wartość wskaźnika pustego (4.10) jest przekształcana na wartość wskaźnika pustego typu docelowego.
  • Wartość typu "wskaźnik do elementu X typu T1" można jawnie przekonwertować na wartość o innym typie "wskaźnik do elementu Y typu T2", jeśli T1 i T2 są zarówno typami funkcji, jak i oboma typami obiektów .
  • Wyrażenie l. Typu T1 można rzutować na typ "odniesienie do T2", jeśli wyrażenie typu "wskaźnik do T1" można jawnie przekonwertować na typ "wskaźnik do T2" za pomocą reinterpret_cast. Oznacza to, że obsada odniesienia reinterpret_cast < T &> (x) ma taki sam efekt jak konwersja * reinterpret_cast < T *> (& x) z wbudowanymi & i * operatorów (i podobnie dla reinterpret_cast < T & &> (x)).
+0

Popełniłeś błąd - jest to akapit 5.2.10 w standardzie (pisałeś 5.3.10) –

+0

Czy liczby nie mogą zostać zmienione z wersji na wersję, przy okazji? :) – Kos

Powiązane problemy