Avertissement du compilateur (niveau 3) C4839
utilisation non standard de la classe « type » en tant qu'argument d'une fonction variadique
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));