【发布时间】:2015-07-10 15:59:31
【问题描述】:
以下代码:
#include <cstdint>
#include <vector>
#include <boost/range/irange.hpp>
int main() {
int64_t first = 0, last = 10;
std::vector<double> result = boost::copy_range<std::vector<double>>(boost::irange(first, last));
}
生成警告(以及 100 多行模板化调用堆栈跟踪):
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0(600):
warning C4244: 'initializing' : conversion from 'unsigned __int64' to 'double', possible loss of data
我想告诉编译器我不在乎我的int64_t 是否被转换为double。我也不想使用 32 位 int 来代替。我通常会使用static_cast<double>(my64BitInt) 来解决这个问题,但这不适用于某个范围。现在我正在使用编译器编译指示来抑制警告,但这并不理想。
编辑:这是带有完整编译器输出的pastebin。
【问题讨论】:
-
1) 如果您认为自己永远不会关心这一点,您可以在项目设置中而不是使用编译指示来抑制警告。 2) 为什么
first和last声明为int64_t而不是double? -
@celticminstrel pragma 在 Visual Studio 中允许您禁止对特定代码行发出警告,并将它们保留在项目的其余部分。
-
我知道。 (你也可以用 clang/gcc 来做,虽然语法有点不同。)我只是指出这一点,部分原因是我个人发现这个特定的警告通常是无用的,而不是有用的,部分原因是你碰巧同意。