IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

c'est un vrai "Cast tête"


Sujet :

C++

  1. #1
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut c'est un vrai "Cast tête"
    Bonjour,

    Il y a un truc qui me semble curieux, et j'ai écrit un tout petit programme minimal pour reproduire le phénomène:

    D'abord, voyons le cas que je considère "normal":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void f2(unsigned int& output)
    {
        output = 5;
    }
     
    signed int f1()
    {
        signed int x;
        f2(x);
        return x;
    }
     
    int main (void)
    {
        signed int y = f1();
     
        return 0;
    }
    Comme vous le voyez, la fonction f2 accepte comme paramètre un unsigned int, mais dans le code de f1, je lui passe un signed int.
    Comme prévu: erreur de compilation:
    error C2664: f2: cannot convert parameter 1 from 'int' to 'unsigned int &'
    Par conséquent, dans le code de f1, je déclare ma variable x unsigned int plutot que signed int:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void f2(unsigned int& output)
    {
        output = 5;
    }
     
    signed int f1()
    {
        unsigned int x; // la ligne qui a changé
        f2(x);
        return x;
    }
     
    int main (void)
    {
        signed int y = f1();
     
        return 0;
    }
    Et c'est la que ça me pose un problème: car cette fois ça compile sans problème. Pourtant la fonction f1 est supposée retourner un signed int, et elle retourne un unsigned int cette-fois...

    Donc ma question:
    Pourquoi le compilo refuse de caster inplicitement signed->unsigned, mais accepte de caster implicitement unsigned->signed?

  2. #2
    screetch
    Invité(e)
    Par défaut
    nan nan nan

    le compilateur refuse les casts de signed int => unsigned int &
    soit, il ne peut pas changer un int en une REFERENCE sur un unsigned.
    en revanche il peut changer les int entre signés et non signés

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    un unsigned int est implicitement convertible en un signed int.
    Si le premier code ne marche pas, c'est parce que cette conversion implicite réalise un temporaire, qui ne peut pas être utilisé avec une référence non-constante.
    Boost ftw

  4. #4
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    merci pour vos réponses, je pense avoir tout compris

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quote ' et double quote " - un vrai problème
    Par CLion dans le forum ASP.NET
    Réponses: 20
    Dernier message: 30/01/2012, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo