【问题标题】:How to use an explicit cast to suppress this warning?如何使用显式强制转换来抑制此警告?
【发布时间】: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&lt;double&gt;(my64BitInt) 来解决这个问题,但这不适用于某个范围。现在我正在使用编译器编译指示来抑制警告,但这并不理想。

编辑:这是带有完整编译器输出的pastebin

【问题讨论】:

  • 1) 如果您认为自己永远不会关心这一点,您可以在项目设置中而不是使用编译指示来抑制警告。 2) 为什么firstlast 声明为int64_t 而不是double
  • @celticminstrel pragma 在 Visual Studio 中允许您禁止对特定代码行发出警告,并将它们保留在项目的其余部分。
  • 我知道。 (你也可以用 clang/gcc 来做,虽然语法有点不同。)我只是指出这一点,部分原因是我个人发现这个特定的警告通常是无用的,而不是有用的,部分原因是你碰巧同意。

标签: c++ boost stl


【解决方案1】:

菲尔说了什么;

但是在这种情况下,您可以使用the iota algorithm 做更简单的事情:

#include <vector>
#include <boost/range/algorithm_ext.hpp>

int main() {
    std::vector<double> result(10);
    boost::iota(result, 0);
}

【讨论】:

    【解决方案2】:

    我认为您需要使用 std::transform 而不是 boost copy_range。另外,我更喜欢使用boost numeric cast 而不是内置的static_cast

    这是一个工作示例:

    template <class DST, class SRC>
    struct Convert
    {
        DST operator()(SRC s) { return boost::numeric_cast<DST>(s); }
    };
    
    int main(int argc, const char* argv[])
    {
        int64_t first = 0, last = 10;
        auto my_range = boost::irange(first, last);
        std::vector<double> result(my_range.size());
        std::transform(my_range.begin(), my_range.end(), result.begin(), Convert<double, int64_t>());
    
        std::cout << "result: ";
        std::copy(result.begin(), result.end(), std::ostream_iterator<double>(std::cout, ", "));
    
    }
    

    上面的代码使用transform和函子Convert。如果你更喜欢 lambda,这也可以(而且更简洁):

    std::transform(my_range.begin(), my_range.end(), result.begin(), 
                   [](int64_t ival) {
                       return boost::numeric_cast<double>(ival);
                   }
                   );
    

    编辑添加 iota 变种也

    正如 sehe 所指出的,要在 [0, 10) 范围内生成双精度向量,您可以使用 std library iota(来自 #include numeric)函数。这是一个不需要 boost 的完整(而且更短)iota 示例:

    std::vector<double> result(10);
    std::iota(result.begin(), result.end(), 0.0);
    std::cout << "result: ";
    std::copy(result.begin(), result.end(), std::ostream_iterator<double>(std::cout, ", "));
    

    谢谢你,谢赫指出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多