编译器错误 C4244:“正在初始化”:从“__int64”转换为“int”,可能丢失数据
Posted
技术标签:
【中文标题】编译器错误 C4244:“正在初始化”:从“__int64”转换为“int”,可能丢失数据【英文标题】:Compiler error C4244: 'initializing' : conversion from '__int64' to 'int', possible loss of data 【发布时间】:2014-10-02 06:17:48 【问题描述】:我正在尝试使用 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
,它将在两个平台上构建而不会出现任何错误?
【问题讨论】:
你确定这是一个错误,还是compile-time warning? 【参考方案1】:在不同的环境中有两种不同的冲突:
第一个是auto
,因为推导类型是 C++11 特性。可能是linux编译器没有默认(使用-std=c++11
,如果没有,升级!)
另一个是std::count的返回类型是size_t
,而不是int
,而且size_t
到int
的转换可能会丢失数据,这取决于size_t
是如何定义的(在至少有符号/无符号不匹配,最终两种类型的大小不同,例如int
为 32 位,size_t
为 64 位。
【讨论】:
【参考方案2】:您收到此警告的原因是,在 64 位构建中,标准容器使用 64 位值作为大小类型,并将 64 位值(例如 size_t
)隐式转换为 32 位值(例如 @987654322 @) 可能会丢失数据。
count
函数返回的实际数据类型(在本例中为 std::vector<T>::difference_type
)可能是您的编译器不支持 auto
时使用的最佳类型。使用size_t
也可能会在没有警告的情况下工作,而且输入起来要短得多。
或者,如果您不担心数据丢失的风险(例如,从不打算在容器中拥有超过 2^32-1 个对象),您可以简单地将警告扔掉:
int count = static_cast<int>( std::count(stdVector.begin(), stdVector.end(), "element") );
【讨论】:
很糟糕的选角。最好不要建议它。使用正确的变量类型要好得多。以上是关于编译器错误 C4244:“正在初始化”:从“__int64”转换为“int”,可能丢失数据的主要内容,如果未能解决你的问题,请参考以下文章
C4244:“+=”:从“std::streamsize”转换为“size_t”,可能丢失数据
如何为 std::vector 复制或使用隐式缩小转换禁用 Visual Studio 警告 C4244
翻译STM32 #define __IO volatile /*!< defines 'read / write' permissions */ IO表示