Partilhar via


Erro do compilador C2397

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 uniforme.

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 do compilador (nível 1) 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 erro 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 C2397:

// C2397.cpp
// compile with: /c
struct S {
   int m1;
   double m2, m3;
};

void func(double d1) {
   char c1 { 127 };   // OK
   char c2 { 513 };   // C2397
   
   S arr[2]{};
   arr[0] = { d1, 2.0, 3.0 };   // C2397
   arr[1] = { static_cast<int>(d1), 2.0, 3.0 };   // OK
}