Hat "const auto" eine Bedeutung?

82

Ich denke, die Frage ist klar genug. Wird das autoSchlüsselwort Konstanz automatisch erkennen oder immer einen Nicht-Konstantentyp zurückgeben, selbst wenn es z. zwei Versionen einer Funktion (eine, die zurückgibt constund die andere, die dies nicht tut).

Nur zur Veranschaulichung, ich benutze const auto end = some_container.end()vor meinen for-Schleifen, aber ich weiß nicht, ob dies notwendig ist oder sich sogar von normal unterscheidet auto.

rubenvb
quelle

Antworten:

31

Vielleicht bist du verwirrend const_iteratorund const iterator. Der erste iteriert über const-Elemente, der zweite kann überhaupt nicht iterieren, da Sie nicht verwenden könnenoperators ++ und - können.

Beachten Sie, dass Sie sehr selten von der iterieren container.end(). Normalerweise verwenden Sie:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
Benoit
quelle
12
cbeginund cendgeben Sie einen const_iteratorby-Wert zurück. const autohat noch seinen Zweck und ist nicht redundant.
dalle
2
const autoIst das in diesem allgemeinen Fall also nützlich?
Rubenvb
@dalle: Ich hatte meinen Absatz entfernt, bevor Sie kommentieren konnten, nachdem mir klar wurde, dass ich nur unsinnige Dinge gesagt hatte :)
Benoit
2
Jemand hat zu viel SQL geschrieben. :)
Andres Jaan Tack
3
Auto wird von const wie von & geändert, es kann in einem foreach verwendet werden, zum Beispiel: en.cppreference.com/w/cpp/language/auto
Janosimas
97
const auto x = expr;

unterscheidet sich von

auto x = expr;

wie

const X x = expr;

unterscheidet sich von

X x = expr;

Also benutze const autound const auto&viel, genau wie du es tun würdest, wenn du es nicht hättestauto .

Die Überlastungsauflösung wird vom Rückgabetyp nicht beeinflusst: constoder nein constauf dem Wert xhat keinen Einfluss darauf, welche Funktionen aufgerufen werden expr.

Antonakos
quelle
17
Nein. Wenn Sie die Variable nicht ändern möchten (oder sollen), sollte sie deklariert werden const.
Paul J. Lucas
7

Angenommen, Sie haben zwei Vorlagen:

template<class U> void f1( U& u );       // 1
template<class U> void f2( const U& u ); // 2

autoleitet den Typ ab und die Variable hat den gleichen Typ wie der Parameter u(wie im // 1Fall), const automacht die Variable zum gleichen Typ wie der Parameter uim // 2Fall. Also const autoeinfach constQualifikation erzwingen .

Kirill V. Lyadvinsky
quelle
3

Der Compiler leitet den Typ für das automatische Qualifikationsmerkmal ab. Wenn ein abgeleiteter Typ ist some_type, const autowird in konvertiert const some_type. Ein guter Compiler untersucht jedoch den gesamten Bereich der autoVariablen und stellt fest, ob sich der Wert dieser Variablen irgendwo ändert. Wenn nicht, leitet der Compiler selbst den folgenden Typ ab: auto-> const some_type. Ich habe dies in Visual Studio Express 2012 versucht und der erzeugte Maschinencode ist in beiden Fällen der gleiche. Ich bin mir nicht sicher, ob jeder Compiler dies tun wird. Es ist jedoch const autoaus drei Gründen eine gute Vorgehensweise :

  • Codierungsfehler vermeiden. Sie wollten, dass sich diese Variable nicht ändert, aber irgendwo in ihrem Bereich wird sie geändert.
  • Die Lesbarkeit des Codes wurde verbessert.
  • Sie helfen , den Compiler , wenn aus irgendeinem Grund es nicht ableiten constzu auto.
BJovke
quelle
Der Compiler leitet const nicht ab, wenn dies möglich ist ... Er fügt const nur hinzu, wenn der Ausdruck, von dem er den Typ ableitet, bereits const von selbst ist. Wenn ein Compiler nur const hinzufügt, um dies zu ermöglichen, kann die Programmsemantik unterbrochen werden, z. B. werden const- oder nicht-const-Mitgliedsfunktionen aufgerufen, je nachdem, ob der jeweilige Compiler die const ableiten kann oder nicht. Ich denke, dein letzter Punkt ist falsch.
rubenvb
@rubenvb Mit den C ++ - Standards können Compiler den Code je nach den gewünschten Optimierungen nach Belieben neu organisieren. Es ist völlig legal für einen Compiler abzuleiten constfür auto wenn es Programmfunktionalität nicht in irgendeiner Weise zu ändern . Dazu gehört auch die Überprüfung, ob konstante und nicht konstante Elementfunktionen verfügbar sind. Der Compiler wird es richtig machen.
BJovke