如何禁用Visual Studio警告C4244,用于std::vector复制或使用隐式缩小转换进行赋值
How to disable Visual Studio warning C4244 for std::vector copy or assign with implicit narrowing conversion
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
是将一种类型的向量转换为另一种类型向量的正确方法。
我强烈建议使用这种方法,而不是使用向量构造函数和静音警告。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- cin >> int 给定一个字符串将 int 赋值为 0
- 如何禁用Visual Studio警告C4244,用于std::vector复制或使用隐式缩小转换进行赋值
- 在C++14中,对浮点变量进行双重赋值的统一初始化不会产生缩小错误