Aracılığıyla paylaş


Derleyici Uyarısı (düzey 4) C4840

variadic işlevine bağımsız değişken olarak 'type' sınıfının taşınabilir olmayan kullanımı

Açıklamalar

Variadic işlevine geçirilen sınıflar veya yapılar önemsiz olarak kopyalanabilir olmalıdır. Bu tür nesneleri geçirirken, derleyici yalnızca bit düzeyinde bir kopya yapar ve oluşturucuyu veya yıkıcıyı çağırmaz.

Bu uyarı Visual Studio 2017'den itibaren kullanılabilir.

Örnek

Aşağıdaki örnek C4840 oluşturur ve nasıl düzeltileceğini gösterir:

// C4840.cpp
// compile by using: cl /EHsc /W4 C4840.cpp
#include <stdio.h>

int main()
{
    struct S {
        S(int i) : i(i) {}
        S(const S& other) : i(other.i) {}
        operator int() { return i; }
    private:
        int i;
    } s(0);

    printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
                       // as an argument to a variadic function
    // To correct the error, you can perform a static cast
    // to convert the object before passing it:
    printf("%i\n", static_cast<int>(s));
}

kullanılarak CStringWoluşturulan ve yönetilen dizeler için, sağlanan operator LPCWSTR() bir nesneyi biçim dizesi tarafından beklenen C stili dize işaretçisine göndermek CStringW için kullanılmalıdır:

    CStringW str1;
    CStringW str2;
    // ...
    str1.Format("%s", static_cast<LPCWSTR>(str2));