86 votes

Est-ce que `const auto` a une signification ?

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

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

103voto

antonakos Points 4921
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 y const auto& beaucoup, tout comme vous le feriez si vous n'aviez pas auto .

La résolution des surcharges 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 .

17 votes

Si vous n'allez pas (ou n'êtes pas censé) modifier la variable, elle doit être déclarée const .

0 votes

Belle réponse claire et concise...

35voto

Benoit Points 35553

Vous confondez peut-être const_iterator y const iterator . La première itère sur des éléments constants, la seconde ne peut pas itérer du tout parce que vous ne pouvez pas utiliser operators ++ et --.

Notez qu'il est très rare d'itérer à partir de l'élément container.end() . En général, vous utiliserez :

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

12 votes

cbegin y cend renvoyer un const_iterator par valeur. const auto a toujours sa raison d'être et n'est pas redondant.

2 votes

Donc const auto est utile dans ce cas général ?

0 votes

@dalle : J'avais retiré mon paragraphe avant que vous ne puissiez commenter, ayant réalisé que je n'avais dit que des choses absurdes :)

7voto

Kirill V. Lyadvinsky Points 47627

Considérons que vous avez deux modèles :

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

auto 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 la // 2 cas. Ainsi, les const auto juste forcer const qualificatif.

3voto

BJovke Points 1101

Le compilateur déduit le type du qualificateur automatique. Si un type déduit est some_type , const auto sera converti en const some_type . Cependant, un bon compilateur examinera l'ensemble du champ d'application de la norme auto et vérifier si la valeur de la variable change quelque part. Si ce n'est pas le cas, le compilateur déduira lui-même le type de la manière suivante : 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 fera cela. Mais c'est une bonne pratique d'utiliser const auto pour trois raisons :

  • Prévenir les erreurs de codage. Vous vouliez que cette variable ne change pas, mais d'une manière ou d'une autre, quelque part dans son champ d'application, 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 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X