Upozornění kompilátoru (úroveň 3) C4839
nestandardní použití třídy "type" jako argumentu pro variadickou funkci
Třídy nebo struktury, které jsou předány do variadické funkce, jako printf
je třeba musí být triviálně kopírovatelné. Při předávání takových objektů kompilátor jednoduše vytvoří bitovou kopii a nevolá konstruktor ani destruktor.
Toto upozornění je k dispozici od sady Visual Studio 2017.
Příklad
Následující ukázka vygeneruje 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
}
Chcete-li chybu opravit, můžete volat členovou funkci, která vrací triviálně kopírovatelný typ,
std::atomic<int> i(0);
printf("%i\n", i.load());
U řetězců vytvořených a spravovaných pomocí CStringW
by se zadaný operator LPCWSTR()
objekt měl použít k přetypování CStringW
objektu na ukazatel C očekávaný formátovacím řetězcem.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));