reinterpret-cast

___ qstntxt ___

Gibt es in C ++ einen Wert bei der Verwendung von %code% für einen Argumenttyp für eine Funktion über einem %code% ? Da ein %code% undurchsichtig ist, besteht das Risiko einer Änderung, außer wenn der Benutzer %code% tut, in diesem Fall könnten sie ebenfalls %code% auf einem %code% tun, und kauft man wirklich alles? Ich frage, weil ich eine Utility-Template-Klasse für Shared-Pointer verwendet habe, die eine Spezialisierung auf %code% bietet, um %code% issue zu vermeiden, aber keine Spezialisierung für %code% , und ich frage mich, ob das nur ein Versehen war oder nie benötigt werden?

    
___ answer11398584 ___

Vergessen Sie nicht den "Dokumentationswert" von %code% . Obwohl jemand es immer wegwerfen kann, dient das %code% dazu, die ursprüngliche Absicht anzuzeigen, dass das Ding, auf das gezeigt wird, nicht über den Zeiger geändert werden sollte. %code% (und %code% ) sollten immer mit Vorsicht verwendet werden und sollten dem Programmierer eine Pause einräumen, wenn / wenn es notwendig ist.

    
___ answer11398592 ___

%code% benötigt zwei Zeigerparameter, einen %code% und den anderen %code% . Der zweite Parameter kann implizit von einem %code% (oder einem anderen Pointer-zu-Const-Objekttyp) -Argument konvertiert werden, während der erste nicht.

Das Fehlen der impliziten Konvertierung ist der Wert - es zwingt den Benutzer dazu, const in dem (unwahrscheinlichen) Ereignis, das er will, absichtlich wegzuwerfen, anstatt es versehentlich zu verwerfen.

Dann müsste der Programmierer in einer Implementierung von %code% oder einer ähnlichen Funktion %code% oder C-style-cast den %code% -Parameter eingeben, bevor er versucht, seinen Verweis zu modifizieren. Sie könnten %code% den nichtkonstanten Parameter eingeben und seinen Verweis ändern. Die Art der Besetzung, die du schreiben musst, um hoffentlich zu sagen, sagt dir etwas darüber, ob das, was du tust, sinnvoll ist.

Ich denke, wenn Ihre shared_ptr Hilfsfunktionen %code% speziell behandeln müssen, dann müssten sie alle cv-qualifizierten %code% speziell behandeln. Das sind vier Fälle: %code% , %code% , %code% , %code% . Aber wenn Benutzer der Funktionen in der Vergangenheit versucht haben, es auf eine %code% , und beschwerte sich, dass es nicht funktioniert hat, aber noch nie probiert es auf eine %code% , dann ist das Problem möglicherweise nicht aufgetreten.

Vielleicht ist %code% bereits ungewöhnlich genug, dass es nicht aufgetaucht ist. Vielleicht tendiert die Art von Person, die %code% benutzt, dazu, cv-Qualifier wegzuwerfen, mit der Begründung, dass, wenn jemand irgendwann den richtigen Typ wiederherstellt, er auch die richtigen Qualifiers wiederherstellt.

Wenn Sie daran denken - funktioniert %code% überhaupt, oder benötigt der Code in %code% , der den Deleter aufruft, eine implizite Konvertierung von %code% nach %code% ? Ich erinnere mich nicht, ob ich jemals ein %code% benutzt habe.

    
___ answer11398570 ___

Es bietet den gleichen Vorteil, den %code% für andere Zeigertypen bietet: Sie können das, worauf gezeigt wird, nur ändern, wenn Sie %code% -ness explizit wegwerfen. In Schnittstellen ist %code% ein Zeichen für Client-Code, dass alles, was Sie übergeben, gelesen, aber nicht geschrieben werden kann. Zum Beispiel wird %code% als

deklariert %Vor%

was signalisiert, dass es %code% lesen und in %code% schreiben wird. Natürlich, wenn es wirklich in C ++ (möglich, aber nicht wahrscheinlich) implementiert wurde, muss es beide Zeiger auf andere Typen umwandeln.

Wenn Sie der Meinung sind, dass Ihnen das "nichts kauft", dann hat das %code% -Schlüsselwort per se offensichtlich keinen Wert.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer11398625 ___

Nun ja, es gibt (einige) die gleichen Vorteile, die %code% immer hat: es dokumentiert die Tatsache, dass der Inhalt nicht mutiert werden soll.

Stellen Sie sich den folgenden Code vor:

%Vor%

Dieser Aufruf wird nur kompiliert, wenn das Funktionsargument als %code% deklariert wurde, andernfalls würde der Client eine %code% benötigen, um die Konstanz wegzuwerfen. Natürlich möchten wir nicht, dass der Klient diese Unannehmlichkeiten hat, und wir wollen auch nicht, dass sie über ihre Daten lügen (indem sie Konstanz wegwerfen).

    
___ answer11398630 ___

Es ist immer noch von Vorteil, den Code "selbst zu dokumentieren".

%Vor% Mit

ohne Kommentar können Sie sehen, dass die angegebenen Daten nicht geändert werden.

Beachten Sie außerdem, dass eine Funktion sowohl eine %code% als auch eine %code% ausführen müsste, um diese %code% promise zu brechen.

    
___ answer11398676 ___

Wie bei allen Verwendungen von %code% dient es zwei Zwecken. Bei der Implementierung der Funktion wird es dem Compiler helfen, Fehlbedienungen zu entdecken, die, wie Sie erwähnen, mit Hilfe von %code% (oder einer C-artigen Umwandlung) erzwungen und zum Schweigen gebracht werden können.

Aber %code% dient einem zweiten Zweck, es bietet die Verheißung, dass das Objekt nicht verändert wird, und ermöglicht es so Benutzern, Zeiger auf const Objekte zu übergeben (unter der Annahme, dass Sie Ihr Versprechen halten) breitere Nutzung Ihrer Funktion. Dies kann an diesem einfachen Beispiel gesehen werden:

%Vor%     
___ tag123const ___ Const ist ein Qualifikationsmerkmal, das zum Definieren eines Datenspeicherbereichs (Objekt, Feld, Variable, Parameter) verwendet wird, der sich "nie ändert", wodurch zusätzliche Codegeneratoroptimierungen und zusätzliche statische Überprüfung der Programmkorrektheit ermöglicht werden. ___ tag123constcast ___ Alles in Zusammenhang mit der Operation 'const_cast' in C ++, d. h. eine Form der Kompilierungskonvertierung, bei der die Konstanten 'const' oder 'volatile' aus einer Variablen weggeworfen (entfernt) werden. ___ tag123voidpointers ___ Ein void-Zeiger (void *) in C und C ++ ist ein Zeiger, der auf eine Speicherstelle ohne spezifizierten Typ zeigt. ___ tag123reininterpretcast ___ Ein C ++ - Operator, der einfach die Konvertierung zwischen Typen durch Neuinterpretieren des zugrunde liegenden Bitmusters ermöglicht. In der allgemeinen Verwendung bedeutet dies, dass ein Zeiger in einen beliebigen anderen Zeigertyp umgewandelt wird und dass auch ein ganzzahliger Typ in einen beliebigen Zeigertyp und umgekehrt konvertiert werden kann. ___ qstnhdr ___ Welchen Wert hat const void * über void *? ___
3
Antworten

warum benutze void ** hier?

Der Code wird von v8-0.2.5 %Vor% Handle Überladungsoperator *, so dass **this und *that Rückgabetyp T* . So scheint es %Vor% funktioniert auch gut?     
07.01.2017, 12:42
3
Antworten

Kann reinterpret_cast (oder eine beliebige Umwandlung) xvalues ​​in lvalues ​​umwandeln?

Ist der folgende Code zulässig (nach C ++ 11 und / oder C ++ 14 Standard (en))? %Vor% Wenn ja, ist das Verhalten nicht definiert? Wenn es nicht undefiniertes Verhalten ist, kann ich sogar a in foo mutieren, ohne dass es UB wird?...
07.11.2014, 02:30
7
Antworten

Äquivalent von C ++ 's reininterpret_cast in C #

Ich frage mich, was C ++% reinterpret_cast in C # bedeutet !? Hier ist mein Beispiel: %Vor% Ich habe keine Einwände, warum f null sein wird, da es so sein sollte. Aber wenn es C ++ wäre, hätte ich Foo f = reinterpret_cast<Foo>...
21.10.2013, 14:51
4
Antworten

Virtuelle Funktionen und Umwandlung in void und zurück

Momentan arbeite ich mit einer Legacy-C ++ - Code-Basis. In dieser Codebasis werden Zeiger auf Objekte in void-Zeiger konvertiert und dann in einer C-Bibliothek gespeichert. Betrachten Sie den folgenden Code: %Vor% Die Objekte interface u...
21.08.2015, 07:30
2
Antworten

reinterpret_cast für fast pod-Daten (ist Layoutkompatibilität genug)

Ich versuche etwas über static_cast und reinterpret_cast zu erfahren. Wenn ich richtig bin, sagt der Standard (9.2.18), dass reinterpret_cast für Pod-Daten sicher ist:    Ein Zeiger auf ein POD-struct-Objekt,   geeignet umgewandel...
20.02.2011, 23:31
6
Antworten

Strict pointer aliasing: Gibt es eine Lösung für ein bestimmtes Problem?

Ich habe ein Problem, das durch das Brechen der strikten Aliasing-Regel des Zeigers verursacht wird. Ich habe den Typ T , der von einer Vorlage kommt, und einen ganzzahligen Typ Int der gleichen Größe (wie bei sizeof ). Mein Code macht im...
05.06.2010, 15:23
2
Antworten

Darf ich ein Beispiel aus dem wirklichen Leben haben, in dem casting void * funktioniert und reinterpret_cast nicht funktioniert?

Es gibt eine Reihe von Fragen in Bezug auf Crosscasts (Cast von T1* auf nicht verwandte T2* ), zum Beispiel dies und dies . Die Antwort lautet normalerweise wie folgt: reinterpret_cast ist die Implementierung definiert und die Konvert...
06.07.2011, 10:24
6
Antworten

Welchen Wert hat const void * über void *?

Gibt es in C ++ einen Wert bei der Verwendung von const void * für einen Argumenttyp für eine Funktion über einem void * ? Da ein void * undurchsichtig ist, besteht das Risiko einer Änderung, außer wenn der Benutzer reinterpret_cast t...
09.07.2012, 15:42