c++ - una - ¿`const auto` tiene algún significado?
sintaxis de una clase c++ (4)
Considera que tienes 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ámetro u
(como en el caso // 1
), const auto
hará que la variable tenga el mismo tipo que el parámetro u
tiene en el caso // 2
. Entonces const auto
solo fuerza const
qualifier.
Creo que la pregunta es lo suficientemente clara. ¿La palabra clave automática detectará automáticamente const-ness, o siempre devolverá un tipo no const, incluso si hay, por ejemplo. dos versiones de una función (una que devuelve const
y la otra que no).
Solo para el registro, sí uso const auto end = some_container.end()
antes de mis for-loops, pero no sé si esto es necesario o incluso diferente del auto
normal.
El compilador deduce el tipo para el autocalificador. Si un tipo deducido es some_type
, const auto
se convertirá en const some_type
. Sin embargo, un buen compilador examinará todo el alcance de auto
variable auto
y encontrará si el valor de la misma cambia en cualquier lugar. Si no, el compilador deducirá un tipo como este: auto
-> const some_type
. Intenté 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 lo hagan. Sin embargo, es una buena práctica usar const auto
por tres razones:
- Previniendo los errores de codificación. Tu intención es que esta variable no cambie, pero de alguna manera en algún lugar de su alcance, se cambia.
- La legibilidad del código se mejora.
- Usted ayuda al compilador si por alguna razón no deduce
const
paraauto
.
Tal vez estés confundiendo const_iterator
y const iterator
const_iterator
. El primero itera sobre los elementos const, el segundo no puede iterar en absoluto porque no puede usar los operators
++ y - en él.
Tenga en cuenta que muy rara vez iterar desde el container.end()
. Usualmente usarás:
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
const auto x = expr;
difiere de
auto x = expr;
como
const X x = expr;
difiere de
X x = expr;
Así que use const auto
y const auto&
mucho, tal como lo haría si no tuviera auto
.
La resolución de sobrecarga no se ve afectada por el tipo de retorno: const
o no const
en lvalue x
no afecta a qué funciones se llaman en expr
.