Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
icke-standardanvändning av klassen "typ" som argument till en variadisk funktion
Anmärkningar
Klasser eller structs som skickas till en variadisk funktion, printf till exempel måste vara trivialt kopierbara. När sådana objekt skickas gör kompilatorn helt enkelt en bitvis kopia och anropar inte konstruktorn eller destruktören.
Den här varningen är tillgänglig från och med Visual Studio 2017.
Example
I följande exempel genereras 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
}
Du kan åtgärda felet genom att anropa en medlemsfunktion som returnerar en trivialt kopierbar typ.
std::atomic<int> i(0);
printf("%i\n", i.load());
För strängar som skapats och hanteras med hjälp av CStringWska den angivna operator LPCWSTR() användas för att omvandla ett CStringW objekt till den C-pekare som förväntas av formatsträngen.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));