Share via


Derleyici Uyarısı (düzey 3) C4839

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

gibi printf bir 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 C4839 oluşturur:

// C4839.cpp
// compile by using: cl /EHsc /W3 C4839.cpp
#include <atomic>
#include <memory>
#include <stdio.h>

int main()
{
    std::atomic<int> i(0);
    printf("%i\n", i); // error C4839: non-standard use of class 'std::atomic<int>'
                        // as an argument to a variadic function
                        // note: the constructor and destructor will not be called;
                        // a bitwise copy of the class will be passed as the argument
                        // error C2280: 'std::atomic<int>::atomic(const std::atomic<int> &)':
                        // attempting to reference a deleted function
}

Hatayı düzeltmek için, önemsiz olarak kopyalanabilir bir tür döndüren bir üye işlevini çağırabilirsiniz.

    std::atomic<int> i(0);
    printf("%i\n", i.load());

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

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