Conversion de type implicite du constructeur C ++ [duplicate]
Nov 14 2020
Supposons que j'ai ce code:
class A {
public:
A(int y) { cout << y; }
};
int main() {
A a(1.5);
return 0;
}
Même si 1.5 est a float, ce code fonctionne et renvoie 1. Le a floatété implicitement converti en int. Pourquoi n'a-t-il pas jeté une exception? Les constructeurs dépendent-ils de la quantité de paramètres ou de leurs types? Où puis-je lire à ce sujet?
Réponses
5 songyuanyao Nov 14 2020 at 16:03
Parce qu'une telle conversion implicite (de doubleà int) est autorisée.
Conversions flottantes-intégrales
- Une prvalue de type à virgule flottante peut être convertie en une prvalue de n'importe quel type entier. La partie fractionnaire est tronquée, c'est-à-dire que la partie fractionnaire est rejetée. Si la valeur ne peut pas entrer dans le type de destination, le comportement n'est pas défini (même lorsque le type de destination n'est pas signé, l'arithmétique modulo ne s'applique pas).
Si vous ne voulez pas qu'une telle construction se produise, vous pouvez ajouter un constructeur prenant doubleet le marquer comme delete. Par exemple
class A {
public:
A(double) = delete;
A(int y) { cout << y; }
};
BTW: 1.5est un double, pas un float.