N379726,4 [complex.numbers] mówi o tym do odlewania std::complex<T>*
T*
Czy to jest legalne do oddania pływak * std :: kompleks <float> *
4 Ponadto, jeśli jest wyrazem typu
cv std::complex<T>*
a ekspresjaa[i]
jest dobrze zdefiniowana dla ekspresji całkowiteji
, a następnie:
-reinterpret_cast<cv T*>(a)[2*i]
wyznacza część rzeczywistąa[i]
i
-reinterpret_cast<cv T*>(a)[2*i + 1]
otrzymuje designat e wyobrażona częśća[i]
.
Czy to (lub inne sformułowanie normy) implikuje, że mogę reinterpret_cast
w inny sposób? Czy mogę to zrobić:
float * pf;
std::complex<float>* pc = reinterpret_cast<std::complex<float>*>(pf);
pc[i].real();
As n.m. wskazany poniżej, musiałbym się upewnić, że wyrównanie pf
jest odpowiednie dla std::complex<float>
. Można założyć, że się tym zajmuje.
Wymogi dotyczące wyrównania dla "kompleksu" mogą być bardziej rygorystyczne niż "float". –
@ n.m. Wystarczająco uczciwe, jak rozumiem, które można naprawić za pomocą 'std :: align' zgodnie z [to pytanie] (http://stackoverflow.com/questions/6973995/dynamic-aligned-memory-allocation-in-c11). – SirGuy
legal, tak 'reinterpret_cast' zasadniczo po prostu mówi kompilacji, aby zinterpretować fragment pamięci jako dowolny typ. Bezpieczne ... o moje nie. – Mgetz