编译器错误 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_tint的转换可能会丢失数据,这取决于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表示

STM32-构建库函数雏形

错误 C2440:“正在初始化”:无法从“const int”转换为“int *”

C++ 无法从枚举转换为 LPCTSTR [关闭]