Bagikan melalui


Compiler Warning (level 4) C4868

Pengompilasi 'file(line_number)' mungkin tidak memberlakukan urutan evaluasi kiri-ke-kanan dalam daftar inisialisasi braced

Elemen daftar inisialisasi yang di-braced akan dievaluasi dalam urutan kiri-ke-kanan. Ada dua kasus di mana pengkompilasi tidak dapat menjamin urutan ini: yang pertama adalah ketika beberapa elemen adalah objek yang diteruskan oleh nilai; yang kedua adalah saat mengkompilasi dengan /clr dan beberapa elemen adalah bidang objek atau merupakan elemen array. Ketika pengkompilasi tidak dapat menjamin evaluasi kiri-ke-kanan, kompilator tersebut mengeluarkan peringatan C4868.

Peringatan ini dapat dihasilkan sebagai hasil dari pekerjaan kesesuaian kompilator yang dilakukan untuk Visual Studio 2015 Update 2. Kode yang dikompilasi sebelum Visual Studio 2015 Update 2 sekarang dapat menghasilkan C4868.

Peringatan ini nonaktif secara default. Gunakan /Wall untuk mengaktifkan peringatan ini.

Untuk mengatasi peringatan ini, pertama-tama pertimbangkan apakah evaluasi kiri-ke-kanan dari elemen daftar inisialisasi diperlukan, seperti ketika evaluasi elemen mungkin menghasilkan efek samping yang bergantung pada pesanan. Dalam banyak kasus, urutan di mana elemen dievaluasi tidak memiliki efek yang dapat diamati.

Jika urutan evaluasi harus kiri ke kanan, pertimbangkan apakah mungkin untuk meneruskan elemen dengan const referensi sebagai gantinya. Perubahan seperti ini menghilangkan peringatan dalam sampel kode berikut.

Contoh

Sampel ini menghasilkan C4868, dan menunjukkan cara untuk memperbaikinya:

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