Share via


Advertencia del compilador (nivel 4) C4868

'archivo(número_de_línea)': el compilador no puede aplicar el orden de evaluación de izquierda a derecha en una lista de inicialización entre llaves

Los elementos de una lista de inicializadores entre llaves se deben evaluar de izquierda a derecha. Hay dos casos en los que el compilador no puede garantizar este orden: el primero es cuando algunos de los elementos son objetos pasados por valor; el segundo es cuando la compilación con /clr y algunos de los elementos son campos de objetos o elementos de matriz. Cuando el compilador no puede garantizar la evaluación de izquierda a derecha, emite la advertencia C4868.

Esta advertencia también puede deberse a una operación de conformidad del compilador para Visual Studio 2015 Update 2. El código compilado con versiones anteriores a Visual Studio 2015 Update 2 ahora puede generar la advertencia C4868.

De forma predeterminada, esta advertencia está desactivada. Use /Wall para activar esta advertencia.

Para resolver esta advertencia, primero considere si es necesaria la evaluación de izquierda a derecha de los operandos, por ejemplo, cuando la evaluación de los operandos podría producir efectos secundarios dependientes del orden. En muchos casos, el orden en el que se evalúan los operandos no tiene un efecto observable.

Si el orden de evaluación debe ser de izquierda a derecha, considere si es posible pasar los elementos por referencia const en su lugar. Un cambio como este elimina la advertencia en el siguiente código de ejemplo.

Ejemplo

Este ejemplo genera la advertencia C4868 y muestra una manera de corregirla:

// C4868.cpp
// compile with: /c /Wall
#include <cstdio>

class HasCopyConstructor
{
public:
    int x;

    HasCopyConstructor(int x): x(x) {}

    HasCopyConstructor(const HasCopyConstructor& h): x(h.x)
    {
        printf("Constructing %d\n", h.x);
    }
};

class TripWarning4868
{
public:
    // note that taking "HasCopyConstructor" parameters by-value will trigger copy-construction.
    TripWarning4868(HasCopyConstructor a, HasCopyConstructor b) {}

    // This variation will not trigger the warning:
    // TripWarning4868(const HasCopyConstructor& a, const HasCopyConstructor& b) {}
};

int main()
{
    HasCopyConstructor a{1};
    HasCopyConstructor b{2};

    // the warning will indicate the below line, the usage of the braced initializer list.
    TripWarning4868 warningOnThisLine{a, b};
};