编译器错误 C4244:'initializing':从 '__int64' 转换为"int",可能会丢失数据



我正试图使用std::count而不是std::vector,如下所示:

int count = std::count( stdVector.begin(), stdVector.end(), "element" );

在windows上,它会给出以下编译器错误。

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

如果我按照以下方式更改代码,Windows编译器不会出现。

auto count = std::count( stdVector.begin(), stdVector.end(), "element" );

然而,由于上述更改,现在我在linux上面临以下错误。

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

我该如何使用std::count,它将在两个平台上构建而不会出现任何错误?

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

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

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

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

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

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

int count = static_cast<int>( std::count(stdVector.begin(), stdVector.end(), "element") );

最新更新