Kompilatorvarning (nivå 4) C4868

Kompilatorn "file(line_number)" kanske inte framtvingar utvärderingsordning från vänster till höger i listan över klammerparenteserade initierare

Anmärkningar

Elementen i en klammerparenteserad initieringslista ska utvärderas i vänster-till-höger-ordning. Det finns två fall där kompilatorn inte kan garantera den här ordningen: den första är när några av elementen är objekt som skickas av värde; Den andra är när du kompilerar med /clr och vissa av elementen är fält för objekt eller matriselement. När kompilatorn inte kan garantera vänster-till-höger-utvärdering genererar den varning C4868.

Den här varningen kan genereras som ett resultat av kompilatorns efterlevnadsarbete som utfördes för Visual Studio 2015 Update 2. Kod som kompilerades före Visual Studio 2015 Update 2 kan nu generera C4868.

Den här varningen är inaktiverad som standard. Använd /Wall för att aktivera den här varningen.

Lös den här varningen genom att först överväga om vänster-till-höger-utvärdering av elementen i initieringslistan är nödvändig, till exempel när utvärdering av elementen kan ge ordningsberoende biverkningar. I många fall har den ordning i vilken element utvärderas inte någon observerbar effekt.

Om utvärderingsordningen måste vara från vänster till höger bör du överväga om det är möjligt att skicka elementen const med referens i stället. En sådan ändring eliminerar varningen i följande kodexempel.

Example

Det här exemplet genererar C4868 och visar ett sätt att åtgärda det:

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