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:
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:
Citation:
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:
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?