Partager via


Avertissement du compilateur (niveau 3) C4839

utilisation non standard de la classe 'type' comme argument d’une fonction variadicique

Les classes ou les structs passés à une fonction variadicique, telles que printf doivent être copiables de manière triviale. Quand de tels objets sont passés, le compilateur effectue simplement une copie au niveau du bit et n’appelle pas le constructeur ou le destructeur.

Cet avertissement est disponible à partir de Visual Studio 2017.

Exemple

L’exemple suivant génère l’erreur 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
}

Pour corriger cette erreur, vous pouvez appeler une fonction membre qui retourne un type copiable de manière triviale,

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

Pour les chaînes générées et gérées à l’aide de CStringW, vous devez utiliser le operator LPCWSTR() fourni pour caster un objet CStringW vers le pointeur C attendu par la chaîne de format.

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