复制到较小类型的数据结构时出现数据丢失警告
Loss of data warning when copying to a data structure of smaller type
我使用的是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)
这当然是编译器特有的。
相关文章:
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 警告 C4267"正在初始化":从'size_t'转换为"DWORD",可能会丢失数据
- 为什么分配可能会丢失数据,而不是产生编译器警告
- 如何避免警告C4244:从'ULONGLONG'转换为"双倍",可能丢失数据
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 警告 C4244:'argument':从 'double' 转换为"浮点数",可能会丢失数据 - C++
- VC++ 警告 C4356:无法通过派生类初始化静态数据成员
- 为什么VC C4244警告(可能丢失数据)专门处理'int'?
- 警告 C4244:"参数":从"double"转换为"int",可能会丢失数据
- 开发C++数据比较的警告
- 警告 1 警告 C4244:"参数":从"time_t"转换为"无符号 int",可能会丢失数据以及其他错误
- 警告 C4244:"参数":从"double"转换为"const int",可能会丢失数据
- 复制到较小类型的数据结构时出现数据丢失警告
- 关于非纯旧数据上的memset的编译时警告
- 如何解决在容器之间传输数据时可能出现的数据丢失警告
- 警告 C4244:'argument':从 'time_t' 转换为"无符号 int",可能会丢失数据 -- C++
- 警告 C4244:'argument':从 'int' 转换为"浮点",可能会丢失数据 (C++)
- C++警告非静态数据成员初始化程序
- 如何避免可能丢失数据的警告
- 警告:非静态数据成员初始化器只能使用-std=c++11或-std=gnu++11[默认启用]