Share via


Error del compilador C2397

la conversión de "type_1" a "type_2" requiere una conversión de restricción

Se ha encontrado una conversión de restricción implícita al usar la inicialización uniforme.

El lenguaje C permite conversiones de restricción implícitas en asignaciones y en la inicialización, y C++ hace lo mismo, aunque la restricción inesperada provoque muchos errores de código. Para que el código sea más seguro, el estándar de C++ requiere un mensaje de diagnóstico cuando se produce una conversión de restricción en una lista de inicialización. En Visual C++, el diagnóstico es Error del compilador C2397 cuando se usa la sintaxis de inicialización uniforme admitida a partir de Visual Studio 2015. El compilador genera Advertencia del compilador (nivel 1) C4838 cuando se usa la sintaxis de inicialización de lista o agregado admitida en Visual Studio 2013.

Una conversión de restricción puede ser correcta cuando usted sepa que el intervalo posible de valores convertidos puede ajustarse al destino. En este caso, usted tiene más conocimientos que el compilador. Si realiza una conversión de restricción intencionadamente, indique explícitamente sus intenciones con una conversión estática. De lo contrario, este mensaje de error casi siempre indica que hay un error en el código. Para corregirlo, asegúrese de que los objetos que inicialice tienen tipos lo suficientemente grandes como para controlar las entradas.

El ejemplo siguiente genera la advertencia 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
}