コンパイラの警告 (レベル 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));