コンパイラの警告 (レベル 4) C4840

可変個引数関数の引数としての、クラス 'type'の移植性のない使用法

解説

可変個引数関数に渡されるクラスまたは構造体は、普通にコピー可能である必要があります。 このようなオブジェクトを渡すときには、コンパイラは単にビットごとのコピーを作成し、コンストラクターまたはデストラクターを呼び出しません。

この警告は、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() を使用して、書式設定文字列によって予期されている C スタイル文字列ポインターに CStringW オブジェクトをキャストする必要があります:

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