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?
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.
%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.
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.
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).
Es ist immer noch von Vorteil, den Code "selbst zu dokumentieren".
%Vor% Mitohne 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.
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%