Share via


Upozornění kompilátoru (úroveň 4) C4840

nepřenosné použití třídy "type" jako argumentu pro variadickou funkci

Poznámky

Třídy nebo struktury, které jsou předány variadické funkci 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 C4840 a ukazuje, jak ji opravit:

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

U řetězců vytvořených a spravovaných pomocí CStringWby se zadaný operator LPCWSTR() objekt měl použít k přetypování CStringW objektu na ukazatel řetězce ve stylu jazyka C očekávaný formátovacím řetězcem:

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