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
constparaauto.
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 .