Avviso del compilatore (livello 3) C4839
uso non standard della classe 'type' come argomento di una funzione variadic
Le classi o gli struct passati a una funzione variadic, ad printf
esempio , devono essere facilmente copiabili. Quando si passano tali oggetti il compilatore si limita a creare una copia bit per bit e non chiama il costruttore o distruttore.
Questo avviso è disponibile a partire da Visual Studio 2017.
Esempio
L'esempio seguente genera l'errore 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
}
Per correggere l'errore, è possibile chiamare una funzione membro che restituisca un tipo facilmente copiabile
std::atomic<int> i(0);
printf("%i\n", i.load());
Per le stringhe compilate e gestite usando CStringW
, l'oggetto fornito operator LPCWSTR()
deve essere usato per eseguire il cast di un CStringW
oggetto al puntatore C previsto dalla stringa di formato.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));