Creo que la pregunta es bastante clara. ¿La auto
palabra 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 const
y 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
.
cbegin
ycend
devuelve unconst_iterator
por valor.const auto
todavía tiene su propósito y no es redundante.const auto
es útil en este caso general?const auto x = expr;
difiere de
auto x = expr;
como
const X x = expr;
difiere de
Así que usa
const auto
yconst auto&
mucho, como lo harías si no tuvierasauto
.La resolución de sobrecarga no se ve afectada por el tipo de retorno:
const
o noconst
en lvaluex
no afecta a qué funciones se llamanexpr
.fuente
const
.Considere que tiene dos plantillas:
template<class U> void f1( U& u ); // 1 template<class U> void f2( const U& u ); // 2
auto
deducirá el tipo y la variable tendrá el mismo tipo que el parámetrou
(como en el// 1
caso),const auto
hará que la variable sea del mismo tipo que el parámetrou
tiene en el// 2
caso. Así queconst auto
forzarconst
calificador.fuente
El compilador deduce el tipo del calificador automático. Si un tipo deducido es
some_type
,const auto
se convertirá enconst some_type
. Sin embargo, un buen compilador examinará todo el alcance de laauto
variable 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 utilizarlaconst auto
por tres razones:const
deauto
.fuente
const
porauto
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.