复制到较小类型的数据结构时出现数据丢失警告

Loss of data warning when copying to a data structure of smaller type

本文关键字:数据 警告 数据结构 小类 类型 复制      更新时间:2023-10-16

我使用的是Visual Studio 2013,我有如下代码:

void f()
{
    std::vector<short> vecshort(10);
    std::vector<long> veclong(10);
    std::copy(veclong.begin(), veclong.end(), vecshort.begin());
}

这会发出警告:

warning C4244: '=' : conversion from 'long' to 'short', possible loss of data

问题是真正的代码在一些模板中。用户可以实例化模板,这样就会出现此警告,但代码的逻辑可以防止任何实际的数据丢失。我如何才能以良好的方式抑制此警告?如果它不在std::copy中,我可以投一个演员阵容。

编辑:该代码将在其他编译器中使用,我不赞成使用杂注。

我认为最好的选择是将std::transform与为您执行强制转换的谓词(或lambda)一起使用(因为您断言转换为较小类型不会丢失数据)。

template <typename To>
struct convert_to
{
    template<typename From>
    To operator()(From source) const { return static_cast<To>(source); }
};
std::transform(veclong.begin(), veclong.end(), vecshort.begin(), convert_to<short>());

您可以使用std::transform:而不是使用std::copy

short to_short(long i)
{
    return static_cast<short>(i);
}
std::vector<short> vShort;
std::vector<long> vLong(10);
std::transform(vLong.begin(), vLong.end(), std::back_inserter<std::vector<short>>(vShort), to_short);

您也可以在lambda中执行强制转换。

您可以放置#pragma来抑制特定的警告。

> #pragma warning(push)
> #pragma warning(disable: 4244) // possible loss of data
> #include <algorithm> 
> #pragma warning(pop)

这当然是编译器特有的。

相关文章: