Partilhar via


Aviso do compilador (nível 1) C4838

a conversão de 'tipo_1' para 'tipo_2' requer uma conversão de estreitamento

Uma conversão de estreitamento implícita foi encontrada ao usar a inicialização de agregação ou lista.

A linguagem C permite conversões implícitas de estreitamento em atribuições e inicialização, e o C++ segue o exemplo, embora o estreitamento inesperado seja uma causa de muitos erros de código. Para tornar o código mais seguro, o padrão C++ requer uma mensagem de diagnóstico quando uma conversão de restrição ocorre em uma lista de inicialização. No Visual C++, o diagnóstico é Erro do Compilador C2397 ao usar a sintaxe de inicialização uniforme com suporte a partir do Visual Studio 2015. O compilador gera um aviso C4838 ao usar a sintaxe de inicialização de lista ou agregação compatível com Visual Studio 2013.

Uma conversão de estreitamento pode ficar boa quando você sabe que o possível intervalo de valores convertidos pode se ajustar ao destino. Nesse caso, você sabe mais do que o compilador. Se você fizer uma conversão de restrição intencionalmente, torne suas intenções explícitas usando uma conversão estática. Caso contrário, essa mensagem de aviso quase sempre indica que você tem um bug em seu código. Você pode corrigi-lo certificando-se de que os objetos inicializados tenham tipos grandes o suficiente para lidar com as entradas.

O exemplo a seguir gera C4838 e mostra uma maneira de corrigi-lo:

// C4838.cpp -- C++ narrowing conversion diagnostics
// Compile by using: cl /EHsc C4838.cpp

struct S1 {
    int m1;
    double m2, m3;
};

void function_C4838(double d1) {
    double ad[] = { 1, d1 }; // OK
    int ai[] = { 1, d1 };    // warning C4838
    S1 s11 = { 1, 2, d1 };   // OK
    S1 s12 { d1, 2, 3 };     // warning C4838
    S1 s13 { static_cast<int>(d1), 2, 3 }; // possible fix for C4838
}