如何禁用Visual Studio警告C4244,用于std::vector复制或使用隐式缩小转换进行赋值

How to disable Visual Studio warning C4244 for std::vector copy or assign with implicit narrowing conversion

本文关键字:缩小 赋值 换进 转换 vector 警告 Studio Visual 何禁用 C4244 std      更新时间:2023-10-16

I希望执行从双精度向量到浮点向量的缩小转换。我不希望Visual Studio抛出警告C4244,"可能丢失数据",即缩小转换范围。

请不要发表评论或回答说我不应该这样做。我知道后果。我只是想抑制警告。在该特定功能范围之外禁用警告是不可接受的,例如通过项目设置全局禁用。

我还想使用向量::复制或向量::赋值。使用static_cast<>通过transform()或for_each()避免警告对我的口味来说太露骨了。因此,这个问题是如何禁用警告,而不是避免它

我的警告抑制尝试不起作用:

vector<float> DoubleVectorToFloat( vector<double> & x ){
#pragma warning( push )
#pragma warning( disable : 4244 ) 
return vector<float>( x.begin(), x.end() );
#pragma warning( pop )  
}

我知道禁用警告是不好的。但一种尺寸并不适合所有人。我的库是实时的,处理10的MiB/s。我希望调用模板_Copy_unchecked1(etc);我不想支付错误检查的性能罚款。

要禁用这种类型的警告,您可能必须将此功能放入自己的模块中,并禁用顶部的警告:

// top-of-file
#pragma warning( disable : 4244 ) 
// All your includes here
std::vector<float> DoubleVectorToFloat( std::vector<double> & x ){
return std::vector<float>( x.begin(), x.end() );
}
// end-of-file

改为使用这个:

std::vector<float> DoubleVectorToFloat(const std::vector<double>& x)
{
std::vector<float> r;
r.reserve(x.size());
std::transform(x.begin(), x.end(), std::back_inserter(r),
[](double a) { return static_cast<float>(a); });
return r;
}

std::transform是将一种类型的向量转换为另一种类型向量的正确方法。

我强烈建议使用这种方法,而不是使用向量构造函数和静音警告。