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