编译器错误C4244:'初始化':从'__int64'转换为'int',可能导致数据丢失

Pra*_*nde 4 c++ linux windows stdvector

我试图在std :: vector上使用std :: cound,如下所示.

int count = std::count( stdVector.begin(), stdVector.end(), "element" );
Run Code Online (Sandbox Code Playgroud)

在Windows上,它提供以下编译器错误.

error C4244: 'initializing' : conversion from '__int64' to 'int', possible loss of data

如果我更改代码如下,Windows编译器不会出现.

auto count = std::count( stdVector.begin(), stdVector.end(), "element" );
Run Code Online (Sandbox Code Playgroud)

但是现在我在linux上面临以下错误以进行上述更改.

error: ISO C++ forbids declaration of 'count' with no type

我将如何使用std::count哪个将在平台上构建而没有任何错误?

Jon*_*ter 5

您收到此警告的原因是,在64位版本中,标准容器使用64位值作为大小类型,并且隐式地将64位值(例如size_t)转换为32位值(例如int)可能会丢失数据.

count函数返回的实际数据类型(在本例中std::vector<T>::difference_type为)可能是编译器不支持时使用的最佳类型auto.使用size_t可能也会在没有警告的情况下工作,并且输入要短得多.

或者,如果您没有被数据丢失的风险所困扰(例如,从未计划在容器中拥有超过2 ^ 32-1个对象),您可以简单地抛弃警告:

int count = static_cast<int>( std::count(stdVector.begin(), stdVector.end(), "element") );
Run Code Online (Sandbox Code Playgroud)


Emi*_*lia 5

在不同的环境中,有两件事可能会发生不同的冲突:

第一个是auto推导类型,它是 C++11 的一项功能。可能是linux编译器默认没有它(只需使用-std=c++11,如果没有,请升级!)

另一个是 std::count 的返回类型是size_t、 not int,并且size_t转换int可能会丢失数据,具体取决于size_t定义方式(至少存在有符号/无符号不匹配,最终两种类型的大小不同,例如32 位int和 64 位size_t)。