Compilerwarnung (Stufe 3) C4839

nicht standardmäßige Verwendung der Klasse "Type" als Argument für eine variadische Funktion

Klassen oder Strukturen, die an eine variadische Funktion übergeben werden, z printf . B. müssen trivial kopierbar sein. Wenn solche Objekte übergeben werden, macht der Compiler einfach eine bitweise Kopie und ruft keinen Konstruktor oder Destruktor auf.

Diese Warnung ist ab Visual Studio 2017 verfügbar.

Beispiel

Im folgenden Beispiel wird C4839 generiert:

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

Sie können eine Memberfunktion aufrufen, die einen einfachen kopierbaren Typ zurückgibt, um den Fehler zu beheben,

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

Für mit CStringW erstellte und verwaltete Zeichenfolgen sollte der bereitgestellte operator LPCWSTR() verwendet werden, um ein CStringW-Objekt in einen C-Zeiger umzuwandeln, der von der Formatzeichenfolge erwartet wird.

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