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};
};
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk