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?