Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
niet-standaardgebruik van klasse 'type' als argument voor een variantische functie
Opmerkingen
Klassen of structs die worden doorgegeven aan een variantische functie, zoals printf trivially copyable moeten zijn. Bij het doorgeven van dergelijke objecten maakt de compiler gewoon een bitsgewijze kopie en roept de constructor of destructor niet aan.
Deze waarschuwing is beschikbaar vanaf Visual Studio 2017.
Example
In het volgende voorbeeld wordt C4839 gegenereerd:
// 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
}
U kunt de fout corrigeren door een lidfunctie aan te roepen die een trivially copyable type retourneert.
std::atomic<int> i(0);
printf("%i\n", i.load());
Voor tekenreeksen die zijn gebouwd en beheerd met behulp CStringWvan, moet de opgegeven operator LPCWSTR() worden gebruikt om een CStringW object naar de C-aanwijzer te casten die wordt verwacht door de notatietekenreeks.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));