Von einigen C-Legacy-Code bekomme ich eine Reihe von Konstanten wie int *
. Im C++ Teil habe ich eine enum des zugrunde liegenden Typs int. Die Konvertierung zwischen enum und int auf einer einzigen Basis funktioniert. Eine Konvertierung zwischen int *
und enum *
ist jedoch nicht möglich. Siehe Codebeispiel unten.Wie konvertiert man zwischen int * und enum *?
Warum ist das und wie würde ich einen Zeiger auf einige int Werte in einen Zeiger auf int enums und umgekehrt konvertieren? Ich erwarte, dass es funktioniert, da die Einzelwert-Conversions funktionieren und die zugrunde liegenden Typen identisch sind. Ich habe über What happens if you static_cast invalid value to enum class? gelesen, konnte aber nicht feststellen, ob möglicherweise ungültige Werte eine Rolle spielen.
int i = 3;
enum E : int;
E e;
e = static_cast<E>(i); // ok
i = static_cast<int>(e); // ok
int *j;
E * f;
j = static_cast<int *>(&i); // ok
f = static_cast<E *>(&i); // 'static_cast': cannot convert from 'int *' to 'E *'
j = static_cast<int *>(&e); // 'static_cast': cannot convert from 'E *' to 'int *'
// now use j and f
*j = *f;
Haben Sie 'reinterpret_cast' probiert? – VTT
Während Sie die Konvertierung mit 'reinterpret_cast' durchführen können, ist dies selten sinnvoll. Sie können den resultierenden Zeiger nicht dereferenzieren, ohne undefiniertes Verhalten aufzurufen. – davmac
@davmac Scheint so, als ob ich entweder sicherstellen sollte, dass ich strenge Aliasing-Regeln abstelle oder über das Kopieren nachdenke. Dank der Antwort und der Diskussion unter der Antwort verstehe ich es jetzt besser. – Trilarion