wake-up-neo.com

Hat "const auto" eine Bedeutung?

Ich denke, die Frage ist klar genug. Wird das Schlüsselwort auto die Konstanz automatisch erkennen oder immer einen Nicht-Konstanz-Typ zurückgeben, auch wenn es z. zwei Versionen einer Funktion (eine, die const zurückgibt und die andere, die dies nicht tut).

Nur für den Datensatz benutze ich const auto end = some_container.end() vor meinen for-Schleifen, aber ich weiß nicht, ob dies notwendig ist oder sich sogar von normalem auto unterscheidet.

70
rubenvb

Vielleicht verwechseln Sie const_iterator Und const iterator. Der erste iteriert über const-Elemente, der zweite kann überhaupt nicht iterieren, da Sie operators ++ und - nicht verwenden können.

Beachten Sie, dass Sie in container.end() nur sehr selten iterieren. Normalerweise verwenden Sie:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
26
Benoit
const auto x = expr;

unterscheidet sich von

auto x = expr;

wie

const X x = expr;

unterscheidet sich von

X x = expr;

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

Die Überladungsauflösung wird nicht durch den Rückgabetyp beeinflusst: const oder no const für den Wert x hat keinen Einfluss darauf, welche Funktionen in expr aufgerufen werden.

85
antonakos

Angenommen, Sie haben zwei Vorlagen:

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

auto leitet den Typ ab und die Variable hat den gleichen Typ wie der Parameter u (wie in // 1 Fall), const auto macht die Variable vom selben Typ wie der Parameter u in // 2 Fall. So const auto nur const Qualifier erzwingen.

Der Compiler leitet den Typ für das Auto-Qualifikationsmerkmal ab. Wenn ein abgeleiteter Typ some_type Ist, wird const auto In const some_type Konvertiert. Ein guter Compiler überprüft jedoch den gesamten Gültigkeitsbereich der Variablen auto und stellt fest, ob sich ihr Wert irgendwo ändert. Andernfalls leitet der Compiler den Typ folgendermaßen ab: auto -> const some_type. Ich habe dies in Visual Studio Express 2012 versucht und der erzeugte Maschinencode ist in beiden Fällen derselbe. Ich bin nicht sicher, ob jeder Compiler dies tun wird. Es wird jedoch aus drei Gründen empfohlen, const auto Zu verwenden:

  • Codierungsfehler vermeiden. Sie wollten, dass sich diese Variable nicht ändert, sondern dass sie sich irgendwo in ihrem Gültigkeitsbereich ändert.
  • Die Lesbarkeit des Codes wird verbessert.
  • Sie helfen dem Compiler, wenn er aus irgendeinem Grund const für auto nicht herleitet.
2
BJovke