Delen via


Compilerwaarschuwing (niveau 4) C4868

'file(line_number)'-compiler dwingt mogelijk geen evaluatievolgorde van links naar rechts af in de lijst met accolades voor initialisatie

Opmerkingen

De elementen van een lijst met accolades worden geëvalueerd in volgorde van links naar rechts. Er zijn twee gevallen waarin de compiler deze volgorde niet kan garanderen: de eerste is wanneer sommige elementen objecten zijn die door de waarde worden doorgegeven; de tweede is bij het compileren met /clr en sommige elementen zijn velden van objecten of matrixelementen. Wanneer de compiler geen links-naar-rechts-evaluatie kan garanderen, wordt de waarschuwing C4868 verzonden.

Deze waarschuwing kan worden gegenereerd als gevolg van het conforme compilerwerk dat is uitgevoerd voor Visual Studio 2015 Update 2. Code die is gecompileerd vóór Visual Studio 2015 Update 2 kan nu C4868 genereren.

Deze waarschuwing is standaard uitgeschakeld. Gebruik /Wall deze waarschuwing om deze waarschuwing te activeren.

U kunt deze waarschuwing oplossen door eerst na te gaan of links-naar-rechts evaluatie van de initialisatielijstelementen nodig is, bijvoorbeeld wanneer evaluatie van de elementen orderafhankelijke bijwerkingen kan opleveren. In veel gevallen heeft de volgorde waarin elementen worden geëvalueerd geen waarneembaar effect.

Als de volgorde van de evaluatie van links naar rechts moet worden gelaten, moet u overwegen of het mogelijk is om de elementen door te geven via const verwijzing. Een dergelijke wijziging elimineert de waarschuwing in het volgende codevoorbeeld.

Example

In dit voorbeeld wordt C4868 gegenereerd en ziet u een manier om dit op te lossen:

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