Avviso del compilatore (livello 4) C4840
uso non portabile della classe 'type' come argomento di una funzione variadic
Osservazioni:
Le classi o gli struct passati a una funzione variadic 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 C4840 e mostra come risolverlo:
// C4840.cpp
// compile by using: cl /EHsc /W4 C4840.cpp
#include <stdio.h>
int main()
{
struct S {
S(int i) : i(i) {}
S(const S& other) : i(other.i) {}
operator int() { return i; }
private:
int i;
} s(0);
printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
// as an argument to a variadic function
// To correct the error, you can perform a static cast
// to convert the object before passing it:
printf("%i\n", static_cast<int>(s));
}
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 di stringa in stile C previsto dalla stringa di formato:
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));