Поделиться через


Предупреждение компилятора (уровень 4) C4840

непереносимое использование класса "type" в качестве аргумента для функции variadic

Замечания

Классы или структуры, передаваемые в вариативную функцию, должны быть тривиально копируемыми. При передаче таких объектов компилятор просто выполняет побитовое копирование и не вызывает конструктор или деструктор.

Это предупреждение доступно начиная с Visual Studio 2017.

Пример

В следующем примере создается C4840 и показано, как исправить его:

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

Для строк, созданных и управляемых с помощью CStringW, необходимо использовать для operator LPCWSTR() приведения CStringW объекта к указателю строки в стиле C, ожидаемой строкой формата:

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