Bagikan melalui


Compiler Warning (level 1) C4838

konversi dari 'type_1' ke 'type_2' memerlukan konversi yang menyempit

Konversi penyempitan implisit ditemukan saat menggunakan inisialisasi agregat atau daftar.

Bahasa C memungkinkan konversi implisit yang menyempit dalam penugasan dan inisialisasi, dan sesuai dengan C++, meskipun penyempitan yang tidak terduga adalah penyebab banyak kesalahan kode. Untuk membuat kode lebih aman, standar C++ memerlukan pesan diagnostik saat konversi yang mempersempit terjadi dalam daftar inisialisasi. Di Visual C++, diagnostiknya adalah Compiler Error C2397 saat menggunakan sintaks inisialisasi seragam yang didukung mulai visual Studio 2015. Pengkompilasi menghasilkan peringatan C4838 saat menggunakan daftar atau sintaks inisialisasi agregat yang didukung oleh Visual Studio 2013.

Konversi yang dipersempit bisa baik-baik saja ketika Anda tahu kemungkinan rentang nilai yang dikonversi dapat sesuai dengan target. Dalam hal ini, Anda tahu lebih dari kompiler. Jika Anda sengaja membuat konversi yang mempersempit, buat niat Anda eksplisit dengan menggunakan pemeran statis. Jika tidak, pesan peringatan ini hampir selalu menunjukkan bahwa Anda memiliki bug dalam kode Anda. Anda dapat memperbaikinya dengan memastikan objek yang Anda inisialisasi memiliki jenis yang cukup besar untuk menangani input.

Sampel berikut menghasilkan C4838 dan menunjukkan salah satu cara untuk memperbaikinya:

// C4838.cpp -- C++ narrowing conversion diagnostics
// Compile by using: cl /EHsc C4838.cpp

struct S1 {
    int m1;
    double m2, m3;
};

void function_C4838(double d1) {
    double ad[] = { 1, d1 }; // OK
    int ai[] = { 1, d1 };    // warning C4838
    S1 s11 = { 1, 2, d1 };   // OK
    S1 s12 { d1, 2, 3 };     // warning C4838
    S1 s13 { static_cast<int>(d1), 2, 3 }; // possible fix for C4838
}