¿Tiene algún significado `const auto`?

82

Creo que la pregunta es bastante clara. ¿La autopalabra clave detectará automáticamente la const-ness, o siempre devolverá un tipo no const, incluso si hay, por ejemplo. dos versiones de una función (una que regresa consty la otra que no).

Solo para que conste, lo uso const auto end = some_container.end()antes de mis bucles for, pero no sé si esto es necesario o incluso diferente de lo normal auto.

rubenvb
fuente

Respuestas:

31

Tal vez estés confundido const_iteratory const iterator. El primero itera sobre los elementos const, el segundo no puede iterar en absoluto porque no puede usar operators++ y - en él.

Tenga en cuenta que rara vez itera desde el container.end(). Por lo general, usará:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
Benoit
fuente
12
cbeginy cenddevuelve un const_iteratorpor valor. const autotodavía tiene su propósito y no es redundante.
dalle
2
Entonces, ¿ const autoes útil en este caso general?
rubenvb
@dalle: había eliminado mi párrafo antes de que pudieras comentar, habiéndome dado cuenta de que había dicho cosas sin sentido :)
Benoit
2
Alguien ha estado escribiendo demasiado sql. :)
Andres Jaan Tack
3
auto se modifica por const como por &, se puede usar en un foreach, por ejemplo: en.cppreference.com/w/cpp/language/auto
Janosimas
97
const auto x = expr;

difiere de

auto x = expr;

como

const X x = expr;

difiere de

X x = expr;

Así que usa const autoy const auto&mucho, como lo harías si no tuvieras auto.

La resolución de sobrecarga no se ve afectada por el tipo de retorno: consto no consten lvalue xno afecta a qué funciones se llaman expr.

Antonakos
fuente
17
No. Si no va a (o se supone que debe) modificar la variable, debe declararse const.
Paul J. Lucas
7

Considere que tiene dos plantillas:

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

autodeducirá el tipo y la variable tendrá el mismo tipo que el parámetro u(como en el // 1caso), const autohará que la variable sea del mismo tipo que el parámetro utiene en el // 2caso. Así que const autoforzar constcalificador.

Kirill V. Lyadvinsky
fuente
3

El compilador deduce el tipo del calificador automático. Si un tipo deducido es some_type, const autose convertirá en const some_type. Sin embargo, un buen compilador examinará todo el alcance de la autovariable y encontrará si su valor cambia en alguna parte. De lo contrario, el propio compilador deducirá un tipo como este: auto-> const some_type. Probé esto en Visual Studio Express 2012 y el código de máquina producido es el mismo en ambos casos, no estoy seguro de que todos y cada uno de los compiladores hagan eso. Sin embargo, es una buena práctica utilizarla const autopor tres razones:

  • Prevención de errores de codificación. Tenía la intención de que esta variable no cambiara, pero de alguna manera en algún lugar de su alcance, se cambia.
  • Se mejora la legibilidad del código.
  • Usted ayuda al compilador si por alguna razón no deduce constde auto.
BJovke
fuente
El compilador no deducirá const si es posible ... Solo agregará const si la expresión de la que está deduciendo el tipo ya es const por sí misma. Si un compilador simplemente agrega const por el simple hecho de que sea posible, la semántica del programa podría romperse, como la llamada a funciones miembro const vs non-const dependiendo de si el compilador en particular puede deducir la constante o no. Entonces creo que tu último punto está mal.
Rubenvb
@rubenvb Los estándares C ++ permiten a los compiladores reorganizar el código de la forma que más les convenga, dependiendo de las optimizaciones deseadas. Es perfectamente legal para un compilador para deducir constpor auto si no cambia la funcionalidad del programa de ninguna manera . Eso también incluye verificaciones si hay funciones de miembro const y no const disponibles. El compilador lo hará bien.
BJovke