Conversión de tipo implícita del constructor C ++ [duplicado]

Nov 14 2020

Supongamos que tengo este código:

class A {
public:
    A(int y) { cout << y; }
};

int main() {
    A a(1.5);

    return 0;
}

Aunque 1.5 es un float, este código funciona y devuelve 1. El floatse convirtió implícitamente en int. ¿Por qué no lanzó una excepción? ¿Los constructores dependen de la cantidad de parámetros o de sus tipos? ¿Dónde puedo leer sobre esto?

Respuestas

5 songyuanyao Nov 14 2020 at 16:03

Porque se permite tal conversión implícita (de doublea int).

Conversiones flotantes-integrales

  • Un prvalue de tipo de punto flotante se puede convertir en un prvalue de cualquier tipo entero. La parte fraccionaria se trunca, es decir, se descarta la parte fraccionaria. Si el valor no cabe en el tipo de destino, el comportamiento no está definido (incluso cuando el tipo de destino no está firmado, no se aplica la aritmética de módulo).

Si no desea que ocurra tal construcción, puede agregar un constructor tomando doubley marcarlo como delete. P.ej

class A {
public:
    A(double) = delete;
    A(int y) { cout << y; }
};

Por cierto: 1.5es un double, no un float.