Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A conversão de «type_1» para «type_2» requer uma conversão mais estreita
Observações
Uma conversão de estreitamento implícita foi encontrada ao usar a inicialização de agregação ou lista.
A linguagem C permite o estreitamento implícito de conversões em atribuições e inicialização, e o C++ segue o exemplo, mesmo que 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 ocorre uma conversão de estreitamento em uma lista de inicialização. No Visual C++, o diagnóstico é Erro de compilador C2397 ao usar a sintaxe de inicialização uniforme suportada a partir do Visual Studio 2015. O compilador gera aviso C4838 ao usar a sintaxe de inicialização de lista ou agregação suportada pelo Visual Studio 2013.
Uma conversão de estreitamento pode ser aceitável quando você sabe que o intervalo possível de valores convertidos pode caber no destino. Neste caso, você sabe mais do que o compilador. Se você fizer uma conversão de estreitamento intencionalmente, torne suas intenções explícitas usando um elenco estático. 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.
Example
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
}