Megosztás a következőn keresztül:


Fordító figyelmeztetése (4. szint) C4868

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