Delen via


Compilerwaarschuwing (niveau 3) C4839

niet-standaardgebruik van klasse 'type' als argument voor een variantische functie

Opmerkingen

Klassen of structs die worden doorgegeven aan een variantische functie, zoals printf trivially copyable moeten zijn. Bij het doorgeven van dergelijke objecten maakt de compiler gewoon een bitsgewijze kopie en roept de constructor of destructor niet aan.

Deze waarschuwing is beschikbaar vanaf Visual Studio 2017.

Example

In het volgende voorbeeld wordt C4839 gegenereerd:

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

U kunt de fout corrigeren door een lidfunctie aan te roepen die een trivially copyable type retourneert.

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

Voor tekenreeksen die zijn gebouwd en beheerd met behulp CStringWvan, moet de opgegeven operator LPCWSTR() worden gebruikt om een CStringW object naar de C-aanwijzer te casten die wordt verwacht door de notatietekenreeks.

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