Avertissement du compilateur (niveau 4) C4868

Le compilateur 'file(line_number)' peut ne pas appliquer l’ordre d’évaluation de gauche à droite dans la liste d’initialiseurs accolades

Les éléments d’une liste d’initialiseurs accolades doivent être évalués dans l’ordre de gauche à droite. Il existe deux cas dans lesquels le compilateur ne peut pas garantir cet ordre : le premier est lorsque certains éléments sont passés par valeur ; la seconde est lors de la compilation avec /clr et certains des éléments sont des champs d’objets ou sont des éléments de tableau. Lorsque le compilateur ne peut pas garantir l’évaluation de gauche à droite, il émet un avertissement C4868.

Cet avertissement peut être généré suite au travail de conformité du compilateur effectué pour Visual Studio 2015 Update 2. Le code compilé avant Visual Studio 2015 Update 2 peut désormais générer l’erreur C4868.

Cet avertissement est désactivé par défaut. Permet /Wall d’activer cet avertissement.

Pour résoudre cet avertissement, commencez par déterminer si l’évaluation de gauche à droite des éléments de liste d’initialiseurs est nécessaire, par exemple lorsque l’évaluation des éléments peut produire des effets secondaires dépendants de l’ordre. Dans de nombreux cas, l’ordre dans lequel les éléments sont évalués n’a pas d’effet observable.

Si l’ordre d’évaluation doit être de gauche à droite, envisagez de passer les éléments par const référence. Une modification telle que celle-ci élimine l’avertissement dans l’exemple de code suivant.

Exemple

Cet exemple génère l’erreur C4868 et montre un moyen de le corriger :

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