Compilerwarnung (Ebene 4) C4868

Der Compiler "file(line_number)" erzwingt möglicherweise nicht die Reihenfolge der Links-nach-rechts-Auswertung in der liste der geschweiften Initialisierer

Die Elemente einer geschweiften Initialisierungsliste werden in der Reihenfolge von links nach rechts ausgewertet. Es gibt zwei Fälle, in denen der Compiler diese Reihenfolge nicht garantieren kann: Die erste ist, wenn einige der Elemente Objekte nach Wert übergeben werden. die zweite ist beim Kompilieren mit /clr und einige der Elemente Felder von Objekten oder Arrayelemente. Wenn der Compiler die Links-nach-Rechts-Auswertung nicht garantieren kann, wird die Warnung C4868 ausgegeben.

Diese Warnung kann als Ergebnis der Compilerkonformität generiert werden, die für Visual Studio 2015 Update 2 ausgeführt wurde. Code, der vor Visual Studio 2015 Update 2 kompiliert wurde, kann jetzt C4868 generieren.

Diese Warnung ist standardmäßig deaktiviert. Verwenden Sie /Wall diese Warnung, um diese Warnung zu aktivieren.

Um diese Warnung zu beheben, sollten Sie zuerst überlegen, ob die Initialisierungslistenelemente von links nach rechts ausgewertet werden müssen, z. B. wenn die Auswertung der Elemente zu orderabhängigen Nebenwirkungen führen kann. In vielen Fällen hat die Reihenfolge, in der Elemente ausgewertet werden, keine feststellbare Wirkung.

Wenn die Reihenfolge der Auswertung von links nach rechts erfolgen muss, überlegen Sie, ob es möglich ist, die Elemente stattdessen per const Verweis zu übergeben. Eine Änderung wie dies beseitigt die Warnung im folgenden Codebeispiel.

Beispiel

In diesem Beispiel wird C4868 generiert, und es wird eine Möglichkeit zum Beheben gezeigt:

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