const int * : Le pointeur lui-même est mutable, mais la valeur pointée est immuable
int * const : le pointeur lui-même est immuable et la valeur pointée est mutable
La conversion de const int * -> int * const signalera une erreur
La conversion int * const -> const int * peut être effectuée
Sémantiquement parlant, c'est plus facile à comprendre, mais d'un point de vue formel, les deux ont une quantité immuable, alors pourquoi une direction est-elle réalisable lors de la conversion, mais pas l'autre ? Après réflexion, c'est peut-être parce que les indicateurs et les valeurs ne sont pas au même niveau, mais je ne sais pas comment être clair ?
Supposons que ce qui est discuté ici est une conversion implicite (similaire à static_cast) :
Le const sous-jacent est conforme aux conversions de qualification : le type cible doit être plus qualifié. Autrement dit, const ne peut être que plus mais pas moins.
Les règles const de niveau supérieur sont plus compliquées. Pour les types de classe, leur possibilité de conversion dépend du constructeur de conversion et de la fonction de conversion. Pour les types non-classes, la conversion const de niveau supérieur n'existe pas. Les conversions standard de la clause 4 ne disent rien sur la const de niveau supérieur.
Nous discutons ici de plusieurs situations impliquant une const de haut niveau :
Expression :
.Tâche :
Initialisation :
.C'est-à-dire que lorsque ce qui est requis est une valeur, il n'y a pas de valeur constante. Concernant glvalue, il existe les conventions suivantes :
Ce paragraphe précise la catégorie de valeur après conversion implicite. Lorsque le résultat de la conversion implicite est prvalue, il n'y a pas de const ; et lorsque le résultat est glvalue, le type cible de conversion doit être une référence lvalue ou une référence rvalue. Dans ce cas, si l'initialisation suivante est vraie, il peut être converti :
T &t = e;
T &&t = e;
const T &t = e;
const T &&t = e;
compatible avec les références limite s'il peut être initialisé. Les règles ici sont similaires aux règles de conversion des qualifications. De plus, ces consts sont déjà des consts sous-jacents.
PS : Il y a une note de bas de page lors des conversions de qualification : "Ces règles garantissent que la sécurité const est préservée par la conversion.". Toutes les conversions const implicites, qu'elles soient convenues ou imaginaires, conviennent tant qu'elles peuvent garantir la sécurité de const. Si une conversion const garantit la sécurité de const, mais ne peut pas être implémentée car elle viole d'autres termes, alors il s'agit probablement d'une pilule de langage. Drôle