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.
Uso não padrão da classe 'tipo' como argumento para uma função variádica
Observações
Classes ou estruturas que são passadas para uma função variádica, como printf 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 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
}
Para corrigir o erro, você pode chamar uma função de membro que retorna um tipo trivialmente copiável,
std::atomic<int> i(0);
printf("%i\n", i.load());
Para cadeias de caracteres criadas e gerenciadas usando CStringW, o fornecido operator LPCWSTR() deve ser usado para converter um CStringW objeto para o ponteiro C esperado pela cadeia de caracteres de formato.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));