Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Előfordulhat, hogy a "file(line_number)" fordító nem kényszeríti ki a balról jobbra történő kiértékelési sorrendet a zárójeles inicializálók listájában
Megjegyzések
A zárójeles inicializálók listájának elemeit balról jobbra sorrendben kell kiértékelni. Két olyan eset van, amikor a fordító nem tudja garantálni ezt a sorrendet: az első az, amikor az elemek egy része érték által átadott objektum; a második az összeállítás /clr , és néhány elem objektummező vagy tömbelem. Ha a fordító nem tudja garantálni a balról jobbra történő kiértékelést, a C4868 figyelmeztetést ad ki.
Ez a figyelmeztetés a Visual Studio 2015 2. frissítéséhez végzett fordítómegfelelőség-munka eredményeként hozható létre. A Visual Studio 2015 Update 2 előtt lefordított kód mostantól létrehozhat C4868-at.
Ez a figyelmeztetés alapértelmezés szerint ki van kapcsolva. A figyelmeztetés aktiválására használható /Wall .
A figyelmeztetés megoldásához először gondolja át, hogy szükség van-e az inicializáló listaelemek balról jobbra történő kiértékelésére, például amikor az elemek kiértékelése rendelésfüggő mellékhatásokat eredményezhet. Az elemek kiértékelésének sorrendje sok esetben nem észlelhető.
Ha a kiértékelési sorrendnek balról jobbra kell lennie, fontolja meg, hogy lehetséges-e inkább hivatkozással const átadni az elemeket. Egy ilyen módosítás kiküszöböli a figyelmeztetést a következő kód példában.
Example
Ez a példa létrehozza a C4868-at, és bemutatja a javítás módját:
// 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};
};