C4267 de aviso (nível 3) do compilador
'var' : conversão de 'size_t' a 'type', possível perda de dados
Durante a compilação com /Wp64, ou durante a compilação em um sistema operacional de 64 bits, tipo de 32 bits, mas size_t é de 64 bits durante a compilação de destinos de 64 bits.
Para corrigir esse aviso, use size_tem vez de um tipo de.
Exemplo
O exemplo a seguir gera 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 também podem ser causados no x86 e este aviso não pode ser resolvido no código, mas pode ser ignorado e suprimido com o warning pragma.
Nessa situação, o C4267 é causado por uma limitação no /Wp64 avisos. Em x86, std::cout<<range_index resolve para a sobrecarga de operator<< que aceita um unsigned int, como size_t é um unsigned int no Win32. C4267 ocorre porque você passou um size_t como um unsigned int argumento, o que causaria o truncamento Win64 onde size_t é de 64 bits, mas unsigned int ainda é de 32-bit. Isso pode ser ignorado porque se você compilou para Win64, std::cout<<range_index resolveria para a sobrecarga de operator<< que aceita um unsigned __int64, já que esse é o tipo size_t está em Win64. O compilador de 32 bits não perceber, portanto, ele avisa.
O exemplo a seguir gera 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
}