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
}