Dela via


Kompilatorvarning (nivå 4) C4840

icke-bärbar användning av klassen "typ" som argument till en variadisk funktion

Anmärkningar

Klasser eller structs som skickas till en variadisk funktion 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

Följande exempel genererar C4840 och visar hur du åtgärdar det:

// C4840.cpp
// compile by using: cl /EHsc /W4 C4840.cpp
#include <stdio.h>

int main()
{
    struct S {
        S(int i) : i(i) {}
        S(const S& other) : i(other.i) {}
        operator int() { return i; }
    private:
        int i;
    } s(0);

    printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
                       // as an argument to a variadic function
    // To correct the error, you can perform a static cast
    // to convert the object before passing it:
    printf("%i\n", static_cast<int>(s));
}

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-formatsträngspekare som förväntas av formatsträngen:

    CStringW str1;
    CStringW str2;
    // ...
    str1.Format("%s", static_cast<LPCWSTR>(str2));