Share via


Upozornění kompilátoru (úroveň 4) C4868

Kompilátor 'file(line_number)' nemusí vynutit pořadí vyhodnocení zleva doprava v seznamu inicializátorů s složenými závorkami.

Prvky seznamu závorek inicializátoru se vyhodnocují v pořadí zleva doprava. Existují dva případy, kdy kompilátor nemůže zaručit toto pořadí: první je, když některé prvky jsou objekty předané hodnotou; Druhý je při kompilaci a /clr některé prvky jsou pole objektů nebo jsou maticové prvky. Pokud kompilátor nemůže zaručit vyhodnocení zleva doprava, vygeneruje upozornění C4868.

Toto upozornění lze vygenerovat v důsledku práce kompilátoru, která byla provedena pro Visual Studio 2015 Update 2. Kód zkompilovaný před sadou Visual Studio 2015 Update 2 teď může generovat C4868.

Toto upozornění je ve výchozím nastavení vypnuté. Slouží /Wall k aktivaci tohoto upozornění.

Chcete-li toto upozornění vyřešit, nejprve zvažte, zda je nezbytné vyhodnocení prvků seznamu inicializátorů zleva doprava, například při vyhodnocení prvků může vést k nežádoucím účinkům závislým na pořadí. V mnoha případech pořadí, ve kterém jsou prvky vyhodnoceny, nemá pozorovatelný účinek.

Pokud musí být pořadí vyhodnocení zleva doprava, zvažte, jestli je místo toho možné předat prvky odkazem const . Změna, jako je tato, eliminuje upozornění v následující ukázce kódu.

Příklad

Tato ukázka vygeneruje C4868 a ukazuje způsob, jak ji opravit:

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