コンパイラの警告 (レベル 3) C4267
'var' : 'size_t' から '型'への変換です。データが失われる可能性があります。
/Wp64 を指定したコンパイル、または 64 ビット オペレーティング システム上でのコンパイルで、64 ビット対応のコンパイルを行うと、type は 32 ビットですが、size_t は 64 ビットになります。
この警告を解決するには、type の代わりに size_t を使用します。
使用例
次の例では C4267 エラーが生成されます。
// C4267.cpp
// compile with: /W3 /Wp64
#include <Windows.h>
void Func(int i) {}
void Func2(DWORD i) {}
void Func3(size_t i) {}
int main() {
size_t bufferSize = 10;
Func(bufferSize); // C4267
Func2(bufferSize); // C4267
Func3(bufferSize); // OK
}
C4267 は x86 プラットフォームでも発生する可能性があります。この警告は、コード内では解決できませんが、warning プラグマで無視して表示されないようにできます。
この場合、C4267 は /Wp64 警告の制約が原因で発生します。x86 では、std::cout<<range_index は unsigned int を受け入れる operator<< のオーバーロードに解決します。これは、Win32 では size_t が unsigned int になるからです。size_t が unsigned int 引数として渡されると、Win64 では size_t が 64 ビットであるのに対し unsigned int が 32 ビットのままであるため切り捨てが行われ、これにより C4267 が発生します。Win64 対応のコンパイルを行う場合、std::cout<<range_index は、Win64 での size_t 型である unsigned __int64 を受け入れる operator<< のオーバーロードに解決するため、このエラーを無視できます。32 ビットのコンパイラはこれを認識しないため、警告を発生します。
次の例では C4267 エラーが生成されます。
// C4267_b.cpp
// compile with: /W3 /Wp64 /EHsc
// processor: x86
#include <fstream>
#include <vector>
using namespace std;
int main() {
ofstream outputfile;
vector<char> vecbuffer(10);
outputfile.write( &vecbuffer[0], vecbuffer.size() ); // C4267
}