Compartir a través de


Advertencia del compilador (nivel 1) C4838

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 de agregado o de lista.

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 la advertencia C4838 cuando se usa la sintaxis de inicialización de lista o de agregado que admite 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 advertencia casi siempre indica que tiene 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.

En el ejemplo siguiente se genera el error C4838 y se muestra cómo corregirlo:

// 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
}