Derleyici Uyarısı (düzey 3) C4839
variadic işlevine bağımsız değişken olarak 'type' sınıfının standart olmayan kullanımı
gibi printf
bir variadic işlevine geçirilen sınıflar veya yapılar önemsiz olarak kopyalanabilir olmalıdır. Bu tür nesneleri geçirirken, derleyici yalnızca bit düzeyinde bir kopya yapar ve oluşturucuyu veya yıkıcıyı çağırmaz.
Bu uyarı Visual Studio 2017'den itibaren kullanılabilir.
Örnek
Aşağıdaki örnek C4839 oluşturur:
// 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
}
Hatayı düzeltmek için, önemsiz olarak kopyalanabilir bir tür döndüren bir üye işlevini çağırabilirsiniz.
std::atomic<int> i(0);
printf("%i\n", i.load());
kullanılarak CStringW
oluşturulan ve yönetilen dizeler için, sağlanan operator LPCWSTR()
bir nesneyi biçim dizesi tarafından beklenen C işaretçisine göndermek CStringW
için kullanılmalıdır.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));