Erro do compilador C2397

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

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 do compilador (nível 1) C4838 ao usar a sintaxe de inicialização de lista ou agregação compatível com o 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 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
}