Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Utilização não portátil da classe «tipo» como argumento para uma função variádica
Observações
As classes ou estruturas que são passadas para uma função variádica devem ser trivialmente copiáveis. Ao passar tais objetos, o compilador simplesmente faz uma cópia bit a bit e não chama o construtor ou destruidor.
Este aviso está disponível a partir do Visual Studio 2017.
Example
O exemplo a seguir gera C4840 e mostra como corrigi-lo:
// 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));
}
Para cadeias de caracteres criadas e gerenciadas usando CStringWo , o fornecido operator LPCWSTR() deve ser usado para converter um CStringW objeto para o ponteiro de cadeia de caracteres estilo C esperado pela cadeia de caracteres de formato:
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));