recherche

Maison  >  Questions et réponses  >  le corps du texte

c++ - Conversion de types entre const int * et int * const

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 ?

为情所困为情所困2780 Il y a quelques jours936

répondre à tous(1)je répondrai

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 13:33:16

    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.

    4.1 Les conversions standard sont des conversions implicites avec une signification intégrée. La clause 4 énumère l'ensemble de ces conversions.

    4.4.1 Une prvalue de type « pointeur vers cv1 T » peut être convertie en une prvalue de type « pointeur vers cv2 T » si « cv2 T » est plus qualifié en cv que « cv1 T ».

    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 :

    5.8 [...] [Remarque : étant donné que les qualificatifs cv sont supprimés du type d'une expression de type non-classe lorsque l'expression est convertie en prvalue, une expression lvalue de type const int peut, par exemple, être utilisé lorsqu'une expression de valeur de type int est requise —note de fin]

    .

    Tâche :

    3.10.1 [...] les opérateurs d'affectation intégrés s'attendent à ce que l'opérande de gauche soit une lvalue et que l'opérande de droite soit une prvalue et donnent une lvalue comme résultat.

    3.10.2 Chaque fois qu'une glvalue apparaît dans un contexte où une prvalue est attendue, la glvalue est convertie en prvalue [...]

     ;

    3.10.4 Les prvalues ​​​​de classe peuvent avoir des types cv-qualifiés ; les prvalues ​​​​non-classe ont toujours des types cv-non qualifiés.

    Initialisation :

    8.5.16 [...] [ Remarque : Une expression de type « cv1 T » peut initialiser un objet de type « cv2 T » indépendamment des qualificatifs cv cv1 et cv2 [...]

    .

    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 :

    4.3 Une expression e peut être implicitement convertie en un type T si et seulement si la déclaration T t=e est bien formée, pour une variable temporaire inventée t (8.5).[...] L'effet de l'un ou l'autre implicite la conversion revient à effectuer la déclaration et l'initialisation, puis à utiliser la variable temporaire comme résultat de la conversion. Le résultat est une lvalue si T est un type de référence lvalue ou une référence rvalue au type de fonction (8.3.2), une valeur x. si T est une référence rvalue au type d'objet, et une valeur pr sinon. L'expression e est utilisée comme valeur gl si et seulement si l'initialisation l'utilise comme valeur gl.

    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;

    8.5.3.4 Étant donné les types « cv1 T1 » et « cv2 T2 », « cv1 T1 » est lié à la référence « cv2 T2 » si T1 est du même type que T2, ou si T1 est une classe de base de T2. T1" est compatible avec la référence avec "cv2 T2" si T1 est lié à la référence à T2 et si cv1 a la même qualification de CV que, ou une qualification de CV supérieure à, cv2.

    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

    répondre
    0
  • Annulerrépondre