1. Beste Antwort auf der Grundlage meiner Einschätzung:
Die Antwort von @Adisak ist nach meiner Einschätzung hier die beste Antwort. Beachten Sie, dass diese Antwort zum Teil die beste ist, weil sie auch le site am besten mit echten Code-Beispielen untermauert , zusätzlich zur Anwendung einer soliden und gut durchdachten Logik.
2. Meine eigenen Worte (ich stimme der besten Antwort zu):
- Bei Pass-by-Value ist es nicht sinnvoll, die
const
. Alles, was es tut, ist:
- schränken den Implementierer ein, jedes Mal eine Kopie erstellen zu müssen, wenn er einen Eingabeparameter im Quellcode ändern will (die Änderung hätte ohnehin keine Nebeneffekte, da das, was übergeben wird, bereits eine Kopie ist, da es sich um eine Wertübergabe handelt). Und häufig wird das Ändern eines Eingabeparameters, der als Wert übergeben wird, verwendet, um die Funktion zu implementieren, so dass das Hinzufügen von
const
können dies überall behindern.
- und Hinzufügen
const
überfrachtet den Code unnötig mit const
und lenkt so die Aufmerksamkeit von den const
s, die wirklich notwendig sind, um sicheren Code zu haben.
- Beim Umgang mit Zeiger o Referenzen Allerdings,
const
ist im Bedarfsfall von entscheidender Bedeutung, und muss verwendet werden, da sie unerwünschte Nebenwirkungen bei anhaltenden Veränderungen verhindert außerhalb die Funktion und somit jeder einzelne Zeiger oder Verweis muss verwenden. const
wenn der Parameter nur eine Eingabe, nicht aber eine Ausgabe ist. Verwendung von const
nur für Parameter, die als Referenz oder Zeiger übergeben werden, hat den zusätzlichen Vorteil, dass sie ganz offensichtlich welche Parameter Zeiger oder Referenzen sind. Das ist eine weitere Sache, die auffällt und sagt: "Achtung! Jeder Parameter mit const
daneben ist ein Verweis oder Zeiger!".
- Was ich oben beschrieben habe, war häufig der Konsens in den professionellen Software-Organisationen, in denen ich gearbeitet habe, und wurde als beste Praxis angesehen. Manchmal war die Regel sogar streng: "Verwenden Sie const niemals bei Parametern, die als Wert übergeben werden, sondern immer bei Parametern, die als Referenz oder Zeiger übergeben werden, wenn es sich nur um Eingaben handelt."
3. Googles Worte (stimmt mit mir überein und ist die beste Antwort):
(Aus dem " Google C++ Style Guide ")
Bei einem Funktionsparameter, der als Wert übergeben wird, hat const keine Auswirkungen auf den Aufrufer und wird daher in Funktionsdeklarationen nicht empfohlen. Siehe TotW #109 .
Die Verwendung von const für lokale Variablen wird weder empfohlen noch abgeraten.
Quelle: Der Abschnitt "Use of const" des Google C++ Style Guide: https://google.github.io/styleguide/cppguide.html#Use_of_const . Dies ist ein wirklich wertvoller Abschnitt, also lesen Sie den ganzen Abschnitt.
Hinweis: "TotW #109" steht für "Tipp der Woche #109: Bedeutungsvoll const
in Funktionsdeklarationen" und ist auch eine nützliche Lektüre. Es ist informativer und weniger präskriptiv, was zu tun ist, und basiert auf Kontext kam vor die Regel des Google C++ Style Guide zu const
zitiert, aber aufgrund der Klarheit, die sie verschafft, ist die const
Die oben zitierte Regel wurde in den Google C++ Style Guide aufgenommen.
Beachten Sie auch, dass ich hier zwar den Google C++ Style Guide zitiere, um meine Position zu verteidigen, dies aber NICHT bedeutet, dass ich den Guide immer befolge oder immer empfehle, den Guide zu befolgen. Einige der dort empfohlenen Dinge sind einfach nur seltsam, wie z. B. ihre kDaysInAWeek
-Style Namenskonvention für "Constant Names" . Dennoch ist es nützlich und relevant, darauf hinzuweisen, wenn eines der weltweit erfolgreichsten und einflussreichsten Technik- und Softwareunternehmen dieselbe Begründung verwendet wie ich und andere wie @Adisak, um unsere Standpunkte zu diesem Thema zu untermauern.
4. Clang's Linter, clang-tidy
hat dafür einige Möglichkeiten:
A. Es ist auch erwähnenswert, dass Clang's linter, clang-tidy
hat eine Option, readability-avoid-const-params-in-decls
, hier beschrieben zu unterstützen. Durchsetzung in einer Codebasis no mit const
für Wertübergabe-Funktionsparameter :
Prüft, ob eine Funktionsdeklaration Parameter hat, die Top-Level-Consts sind.
const-Werte in Deklarationen haben keinen Einfluss auf die Signatur einer Funktion und sollten daher dort nicht eingefügt werden.
Beispiele:
void f(const string); // Bad: const is top level.
void f(const string&); // Good: const is not top level.
Und hier sind zwei weitere Beispiele, die ich der Vollständigkeit und Klarheit halber selbst hinzugefügt habe:
void f(char * const c_string); // Bad: const is top level. [This makes the _pointer itself_, NOT what it points to, const]
void f(const char * c_string); // Good: const is not top level. [This makes what is being _pointed to_ const]
B. Es hat auch diese Option: readability-const-return-type
- https://clang.llvm.org/extra/clang-tidy/checks/readability-const-return-type.html
5. Mein pragmatischer Ansatz, wie ich einen Style Guide zu diesem Thema formulieren würde:
Ich würde das einfach kopieren und in meinen Style Guide einfügen:
[COPY/PASTE START]
- Verwenden Sie immer
const
bei Funktionsparametern, die per Verweis oder Zeiger übergeben werden, wenn ihr Inhalt (worauf sie zeigen) NICHT geändert werden soll. Auf diese Weise wird deutlich, wenn eine per Verweis oder Zeiger übergebene Variable geändert werden soll, da sie keine const
. In diesem Anwendungsfall const
verhindert unbeabsichtigte Nebeneffekte außerhalb der Funktion.
- Sie ist nicht empfohlen zu verwenden
const
für Funktionsparameter, die als Wert übergeben werden, da const
hat keine Auswirkungen auf den Aufrufer: Selbst wenn die Variable in der Funktion geändert wird, gibt es keine Nebeneffekte außerhalb der Funktion. In den folgenden Ressourcen finden Sie weitere Begründungen und Einblicke:
- "Google C++ Style Guide" Abschnitt "Verwendung von const"
- "Tipp der Woche #109: Bedeutungsvoll
const
in Funktionsdeklarationen"
- Stack Overflow-Antwort von Adisak auf "Verwendung von 'const' für Funktionsparameter"
- " Verwenden Sie niemals Top-Level
const
[d.h.: const
zu den Parametern nach Wert übergeben ] auf Funktionsparameter in Deklarationen, die keine Definitionen sind (und achten Sie darauf, dass Sie nicht einen sinnlosen Text kopieren/einfügen const
). Es ist bedeutungslos und wird vom Compiler ignoriert, es ist visuelles Rauschen und könnte die Leser in die Irre führen" ( https://abseil.io/tips/109 (Hervorhebung hinzugefügt).
- Die einzige
const
Qualifizierer, die sich auf die Kompilierung auswirken, sind diejenigen, die in der Funktionsdefinition platziert sind, NICHT diejenigen in einer Vorwärtsdeklaration der Funktion, wie z.B. in einer Funktions- (Methoden-) Deklaration in einer Header-Datei.
- Verwenden Sie niemals Top-Level
const
[d.h.: const
auf Variablen nach Wert übergeben ] auf Werte zurückgegeben durch eine Funktion.
- Verwendung von
const
auf Zeiger oder Referenzen, die von einer Funktion zurückgegeben werden, ist bis zum Umsetzer da sie manchmal nützlich ist.
- TODO: Durchsetzung einiger der oben genannten Punkte durch folgende Maßnahmen
clang-tidy
Optionen:
- https://clang.llvm.org/extra/clang-tidy/checks/readability-avoid-const-params-in-decls.html
- https://clang.llvm.org/extra/clang-tidy/checks/readability-const-return-type.html
Hier sind einige Code-Beispiele zur Veranschaulichung der const
oben beschriebenen Regeln:
const
Beispiele für Parameter:
(einige sind entlehnt aus ici )
void f(const std::string); // Bad: const is top level.
void f(const std::string&); // Good: const is not top level.
void f(char * const c_string); // Bad: const is top level. [This makes the _pointer itself_, NOT what it points to, const]
void f(const char * c_string); // Good: const is not top level. [This makes what is being _pointed to_ const]
const
Beispiele für Rückgabetypen:
(einige sind entlehnt aus ici )
// BAD--do not do this:
const int foo();
const Clazz foo();
Clazz *const foo();
// OK--up to the implementer:
const int* foo();
const int& foo();
const Clazz* foo();
[KOPIEREN/EINFÜGEN ENDE]
Schlüsselwörter: Verwendung von <code>const</code> in Funktionsparametern; Codierungsstandards; C- und C++-Codierungsstandards; Codierungsrichtlinien; bewährte Praktiken; Codestandards; konstante Rückgabewerte