Share via


Upozornění kompilátoru (úroveň 3) C4839

nestandardní použití třídy "type" jako argumentu pro variadickou funkci

Třídy nebo struktury, které jsou předány do variadické funkce, jako printf je třeba musí být triviálně kopírovatelné. Při předávání takových objektů kompilátor jednoduše vytvoří bitovou kopii a nevolá konstruktor ani destruktor.

Toto upozornění je k dispozici od sady Visual Studio 2017.

Příklad

Následující ukázka vygeneruje C4839:

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

Chcete-li chybu opravit, můžete volat členovou funkci, která vrací triviálně kopírovatelný typ,

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

U řetězců vytvořených a spravovaných pomocí CStringWby se zadaný operator LPCWSTR() objekt měl použít k přetypování CStringW objektu na ukazatel C očekávaný formátovacím řetězcem.

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