Conversão de tipo implícito do construtor C ++ [duplicado]

Nov 14 2020

Vamos supor que eu tenha este código:

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

int main() {
    A a(1.5);

    return 0;
}

Mesmo que 1.5 seja um float, esse código funciona e retorna 1. O floatfoi implicitamente convertido em int. Por que não lançou uma exceção? Os construtores dependem da quantidade de parâmetros ou de seus tipos? Onde posso ler sobre isso?

Respostas

5 songyuanyao Nov 14 2020 at 16:03

Porque essa conversão implícita (de doublepara int) é permitida.

Conversões integrais flutuantes

  • Um prvalue do tipo de ponto flutuante pode ser convertido em um prvalue de qualquer tipo inteiro. A parte fracionária é truncada, ou seja, a parte fracionária é descartada. Se o valor não se ajustar ao tipo de destino, o comportamento é indefinido (mesmo quando o tipo de destino não tem sinal, o módulo aritmético não se aplica).

Se você não quiser que tal construção aconteça, você pode adicionar um construtor taking doublee marcá-lo como delete. Por exemplo

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

BTW: 1.5é um double, não um float.