Share via


Derleyici Uyarısı (düzey 1) C4838

'type_1'den 'type_2' dönüştürme için daraltma dönüştürmesi gerekir

Toplama veya liste başlatma kullanılırken örtük bir daraltma dönüştürmesi bulundu.

C dili, atamalarda ve başlatmada örtük daraltma dönüştürmelerine olanak tanır ve beklenmeyen daraltma birçok kod hatasının nedeni olsa da C++ da buna uyar. Kodu daha güvenli hale getirmek için C++ standardı, bir başlatma listesinde bir daraltma dönüştürmesi gerçekleştiğinde bir tanılama iletisi gerektirir. Visual C++'da, Visual Studio 2015'den başlayarak desteklenen tekdüzen başlatma söz dizimi kullanılırken tanılama Derleyici Hatası C2397'dir. Derleyici, Visual Studio 2013 tarafından desteklenen liste veya toplu başlatma söz dizimini kullanırken C4838 uyarısını oluşturur.

Dönüştürülen değerlerin olası aralığının hedefe sığabileceğini bildiğinizde daraltma dönüştürmesi sorun olmayabilir. Bu durumda, derleyiciden daha fazlasını biliyorsunuz. Kasıtlı olarak bir daraltma dönüştürmesi yaparsanız, statik bir atama kullanarak amaçlarınızı açık hale getirin. Aksi takdirde, bu uyarı iletisi neredeyse her zaman kodunuzda bir hata olduğunu gösterir. Başlatdığınız nesnelerin girişleri işlemek için yeterince büyük türler içerdiğinden emin olarak düzeltebilirsiniz.

Aşağıdaki örnek C4838 oluşturur ve düzeltmenin bir yolunu gösterir:

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