【发布时间】:2013-07-23 16:06:55
【问题描述】:
我正在尝试将数据从一个容器传输到另一个容器:
#include <vector>
int main()
{
std::vector<int> input_data;
std::vector<float> output_data;
output_data.insert(output_data.end(), input_data.begin(), input_data.end());
}
在 VS2005 中,我在 base.hpp 中收到三个 C4244 警告,说“从 'const int' 转换为 'const float',可能丢失数据。”
现在我理解了这个警告,这是一个合法的警告。但是在我的特殊情况下,数据丢失可以忽略不计。有什么方法可以在不必执行这样的循环的情况下确认警告?
for (std::vector<int>::const_iterator it; it != input_data.end(); ++it)
{
output_data.push_back(static_cast<float32>(*it));
}
【问题讨论】:
-
我正在寻找一种方法来做到这一点没有循环和显式转换。
-
我认为使用演员表进行“转换”会起作用 - 您需要演员表来转换类型而不会发出警告,因此您无法真正避免这种情况。 [除非您关闭警告,否则就是]。
-
std::transform(input_data.begin(), input_data.end(), std::back_inserter(output_data), [](int x) { return static_cast<float>(x); });。就像 Mats 说的那样,如果没有演员表,你就无法真正摆脱警告。对我来说,这看起来像是一个“选择你的毒药”场景。 -
你确实需要一个明确的演员表。您可以使用
std::transform代替循环,将强制转换作为操作,包装在 lambda 或自定义函数对象中。 -
在 VS 中,您可以通过在报告问题的行上方使用
#pragma warning(suppress: 4244)来消除警告。
标签: c++