Delen via


Compilerwaarschuwing (niveau 4) C4840

niet-draagbaar gebruik van klasse 'type' als argument voor een variantische functie

Opmerkingen

Klassen of structs die worden doorgegeven aan een variantische functie, moeten trivially kopieerbaar 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 C4840 gegenereerd en ziet u hoe u dit kunt oplossen:

// 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));
}

Voor tekenreeksen die zijn gebouwd en beheerd met behulp CStringWvan, moet de opgegeven operator LPCWSTR() worden gebruikt om een CStringW object te casten naar de tekenreeks in C-stijl die wordt verwacht door de notatietekenreeks:

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