Предупреждение компилятора (уровень 3) C4267
"переменная" : преобразование из "size_t" в "тип", возможна потеря данных
При компиляции с параметром /Wp64 или при компиляции в 64-разрядной операционной системе тип имеет 32-разрядное значение, а тип данных size_t при компиляции для 64-разрядных целевых платформ имеет 64-разрядное значение.
Чтобы решить эту проблему, вместо типа рекомендуется использовать тип данных 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 разрешается в перегрузку оператора operator<<, который принимает значение типа unsigned int, поскольку тип size_t в Win32 является типом unsigned int. Предупреждение C4267 возникает в результате того, что значение типа size_t передано как аргумент unsigned int, что приводит к усечению в системе Win64, где size_t имеет 64-разрядное значение, а тип unsigned int по-прежнему является 32-разрядным. Это можно не учитывать, так как при компиляции для системы Win64 вызов std::cout<<range_index разрешится в перегрузку оператора operator<<, которая принимает параметр типа unsigned __int64, поскольку именно этот тип выступает в качестве типа size_t на платформе Win64. 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
}