Pourquoi «le plus important des constants» doit-il être const?

Dans http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/, il mentionne “le plus important const” où, par C ++ spécifie délibérément que la liaison d’un object temporaire à une référence à const sur la stack allonge la durée de vie du temporaire à la durée de vie de la référence elle-même. Je me demandais pourquoi c ++ n’autorise l’allongement de la durée de vie de l’object que lorsque la référence est const et non lorsqu’il ne l’est pas. Quelle est la raison d’être de la fonctionnalité et pourquoi doit-elle être constante?

Voici un exemple:

 void square(int &x) { x = x * x; } int main() { float f = 3.0f; square(f); std::cout << f << '\n'; } 

Si les éléments temporaires pouvaient se lier à des références non constantes, les éléments ci-dessus se comstackraient avec bonheur, mais produiraient des résultats plutôt surprenants (un résultat de 3 au lieu de 9 ).

Considérer ce qui suit:

 int& x = 5; x = 6; 

Que devrait-il se passer si cela était autorisé? En revanche, si vous avez fait

 const int& x = 5; 

il n’y aurait aucun moyen légal de modifier x .

Notez que les références const peuvent être liées à des objects qui n’ont même pas d’adresse normalement. Un paramètre const int & function peut prendre un argument formé par l’expression constante littérale 42 . Nous ne pouvons pas prendre l’adresse de 42 , nous ne pouvons donc pas la transmettre à une fonction qui prend un const int * .

Les références const sont spécialement “bénies” pour pouvoir se lier à des valeurs telles que celle-ci.

Bien sûr, pour les valeurs traditionnelles telles que 2 + 2 , la durée de vie n’est pas un problème. C’est un problème pour les valeurs de type de classe.

Si la liaison d’une référence à un object qui, contrairement à 42 , n’a pas de durée de vie omniprésente est autorisée, cette durée de vie doit être étendue de manière à ce que la référence rest saine dans tout son champ d’application.

Ce n’est pas que const provoque une extension de durée de vie, mais qu’une référence non const n’est pas autorisée. Si cela était autorisé, il faudrait aussi une prolongation de la vie; il est inutile d’autoriser une référence qui va ensuite mal dans certaines parties de son champ d’application. Ce comportement mine l’idée qu’une référence est plus sûre qu’un pointeur.