Ist es wahr, dass const_cast nur eine Möglichkeit ist, dem Compiler zu sagen: "Hör auf zu stöhnen, behandle das als nicht-konstanten Zeiger"? Gibt es Fälle, in denen const_cast selbst in tatsächlichen Maschinencode übersetzt wird?Führt const_cast jemals zu tatsächlicher Code-Emission?
Antwort
Vorstellbar, es könnte Architekturen geben, bei denen ein const-Zeiger eine andere Darstellung als eine nicht-konstante hatte, in welchem Fall der Compiler einen Code ausgeben müsste. Mir sind solche Architekturen jedoch nicht bekannt.
Clever, aber nicht wahr: const ist nur Attribut, es bedeutet nicht, dass Sie nicht schreiben können (betrachten Sie veränderliche Mitglieder). Wenn Sie eine Architektur konzipieren, in der schreibgeschützte und schreibgeschützte oder schreibgeschützte Zeiger unterschiedlich sind, wird der Code immer noch nicht bei der Umwandlung, sondern bei der eigentlichen Schreiboperation generiert. – Suma
Ich habe absichtlich nicht gesagt _wenn_ der Compiler würde etwas Code ausgeben müssen. –
Ist überhaupt nicht wichtig. Der const_cast würde das hypothetische "Nur-Lese-Bit" im Zeiger entfernen, wie es durch einen Const-Zeiger in ein veränderbares Element geschrieben würde. Letzteres kann vom Compiler mit 100% Genauigkeit erkannt werden. – MSalters
Nein, es entfernt nur das Attribut const zur Kompilierzeit.
const_cast wirft nur die Konstanz eines Attributs und nichts mehr weg.
const
ändert nicht die Darstellung eines Typs, insbesondere die Darstellung von T*
ist genau das gleiche wie T const*
.
Betrachten:
int i,
* const cpi = &i,
* const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*
Die Darstellung von cpi
zugleich ein int*
und eine int const*
über *pcpci
darstellt.
Es gibt keine Möglichkeit, die Darstellung von cpi
zu ändern, wenn pcpci
initialisiert wird.
Natürlich, wenn die Zeigerobjekte nicht signifikante Bits haben, kann der Compiler sie zufällig umdrehen; insbesondere kann const_cast
die nicht signifikanten Bits eines Zeigers spiegeln, aber auch jede implizite Konvertierung könnte dies tun. Ich glaube nicht, dass dieser Fall in der realen Welt existiert.
Dasselbe gilt, wenn zwei verschiedene Bitmuster denselben Adresswert ergeben (Basis + Offset, wenn Offset groß genug ist).
- 1. Form bei "Tatsächlicher Größe"
- 2. Führt Elixir unendliche Rekursion jemals den Stapel über?
- 3. SoftLayer API-Ergebnis und tatsächlicher Abrechnungszeitraum
- 4. Print \ n als tatsächlicher Newline in Terminal
- 5. Korrekte Verwendung (en) von const_cast <>
- 6. Warum const_cast ist für unique_ptr nicht erlaubt?
- 7. C++ const_cast Verwendung anstelle von C-Casts
- 8. Wird find() jemals nichtdeterministisch wirken?
- 9. Hat jemand jemals versucht, DialerFilter zu verwenden?
- 10. fxmlLoader.getController() führt zu Nullzeigerausnahme?
- 11. ARRAY_AGG führt zu OOM
- 12. Listenmanipulation führt zu Endlosschleife
- 13. Nicht-triviales Beispiel für undefiniertes Verhalten mit const_cast
- 14. Führt der Browser jemals eine Cache-Antwort durch, wenn keine zum Cache gehörenden Header zurückgegeben werden?
- 15. Wird > jemals benötigt?
- 16. Würde das jemals funktionieren?
- 17. CLGeocoder jemals eine Ortsmarkierung
- 18. Schlägt Q.allSettled jemals fehl?
- 19. Wird document.createElement ("") jemals fehlschlagen?
- 20. Ist document.cookie jemals undefiniert?
- 21. Führt LD_LIBRARY_PATH wirklich zu Inkonsistenzen?
- 22. month.abb [] führt zu falschen Ergebnissen
- 23. Datenbankverschiebung führt zu blockierten IPs?
- 24. AJAX führt zu mehr "chattiness"
- 25. iOS entlassenModalViewController führt zu EXC_BAD_ACCESS
- 26. Führt "Rückgabewertoptimierung" zu undefiniertem Verhalten?
- 27. Installation Edelsteine führt zu Fehler
- 28. Multiplikation, die zu 0 führt
- 29. Manchmal HttpURLConnection.getInputStream führt zu langsam
- 30. DriveApp.getFolderById führt zu einem Fehler
Ja, es ist wahr. – user51568