Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
nietypowe użycie klasy "type" jako argumentu do funkcji wariadycznej
Uwagi
Klasy lub struktury przekazywane do funkcji wariadycznej, takie jak printf muszą być trywialnie kopiowalne. Podczas przekazywania takich obiektów kompilator po prostu wykonuje kopię bitową i nie wywołuje konstruktora ani destruktora.
To ostrzeżenie jest dostępne począwszy od programu Visual Studio 2017.
Przykład
Poniższy przykład generuje kod 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
}
Aby poprawić błąd, można wywołać funkcję składową, która zwraca trywialnie skopiowalny typ,
std::atomic<int> i(0);
printf("%i\n", i.load());
W przypadku ciągów skompilowanych i zarządzanych przy użyciu CStringWmetody należy użyć podanego operator LPCWSTR() obiektu do rzutowania CStringW obiektu do wskaźnika języka C oczekiwanego przez ciąg formatu.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));