Aviso do compilador (nível 4) C4840

o uso não portátil da classe 'type' como um argumento para uma função variadic

Comentários

Classes ou structs que são passados para uma função variádica precisam ser facilmente copiáveis. Ao passar esses objetos, o compilador simplesmente faz uma cópia bit a bit e não chama o construtor nem o destruidor.

Esse aviso está disponível no Visual Studio 2017 e posteriores.

Exemplo

O seguinte exemplo gera o erro 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 o CStringW, o operator LPCWSTR() fornecido deve ser usado para converter um objeto CStringW no ponteiro de estilo C esperado pela cadeia de caracteres de formato:

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