web-dev-qa-db-fra.com

«const auto» a-t-il un sens?

Je pense que la question est suffisamment claire. Le mot-clé auto détectera-t-il automatiquement la constance, ou retournera-t-il toujours un type non const, même s'il y a par exemple. deux versions d'une fonction (une qui renvoie const et l'autre qui ne le fait pas).

Pour mémoire, j'utilise const auto end = some_container.end() avant mes boucles for, mais je ne sais pas si cela est nécessaire ou même différent de la normale auto.

70
rubenvb

Vous confondez peut-être const_iterator Et const iterator. Le premier itère sur les éléments const, le second ne peut pas du tout itérer car vous ne pouvez pas utiliser operators ++ et - dessus.

Notez que vous parcourez très rarement la container.end(). Habituellement, vous utiliserez:

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

diffère de

auto x = expr;

comme

const X x = expr;

diffère de

X x = expr;

Utilisez donc const auto et const auto& beaucoup, comme vous le feriez si vous n'aviez pas auto.

La résolution de surcharge n'est pas affectée par le type de retour: const ou non const sur la valeur l x n'affecte pas les fonctions appelées dans expr.

85
antonakos

Considérez que vous avez deux modèles:

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

auto en déduira le type et la variable aura le même type que le paramètre u (comme dans le // 1 Cas), const auto rendra la variable du même type que le paramètre u a dans le // 2 Cas. Alors const auto force juste const qualificatif.

7
Kirill V. Lyadvinsky

Le compilateur déduit le type du qualificatif automatique. Si un type déduit est some_type, const auto sera converti en const some_type. Cependant, un bon compilateur examinera toute l'étendue de la variable auto et trouvera si sa valeur change n'importe où. Sinon, le compilateur lui-même déduira le type comme ceci: auto -> const some_type. J'ai essayé cela dans Visual studio express 2012 et le code machine produit est le même dans les deux cas, je ne suis pas sûr que chaque compilateur le fera. Mais, c'est une bonne pratique d'utiliser const auto pour trois raisons:

  • Prévention des erreurs de codage. Vous vouliez que cette variable ne change pas, mais d'une manière ou d'une autre dans sa portée, elle est modifiée.
  • La lisibilité du code est améliorée.
  • Vous aidez le compilateur si, pour une raison quelconque, il ne déduit pas const pour auto.
2
BJovke