【问题标题】:"void value not ignored as it ought to be" on non-void function非空函数上的“空值不应被忽略”
【发布时间】:2018-12-23 10:10:37
【问题描述】:

这是我的代码

  void execute() {
    for (u32 f = 0; f < numForces; f++)
    {
      u32 length = end - start;
      PhysicalObject* arr = objects + start;
      std::vector<bool> tmp(length);
      bool* tmpArr = tmp.data();
      forces[f].affected(arr, length, tmpArr);
      for(u32 index = 0; index < length; index++)
        if (tmp[index])
          forces[f].apply(arr[index]);
    }
  }

一行

      bool* tmpArr = tmp.data();

向我抛出错误:“不应忽略的无效值” 我查看了文档,我确定向量的数据方法是非 void 并且应该返回一个指针:> http://www.cplusplus.com/reference/vector/vector/data/

有什么想法会出错吗?

重要的事情:

  • 我包括矢量
  • 我在 gcc 上的编译标志:-Wall -Wextra -Wcast-qual -pedantic -pedantic-errors -Wfatal-errors -Wno-missing-braces -Werror
  • 该函数是一个类,但我没有添加其余部分,因为它只是消除了问题的焦点,而且它是一个使用复杂架构并行运行的类。

【问题讨论】:

  • 那是std::vector&lt;bool&gt;特化的特殊问题,无法获取单个位的地址。
  • 这个问题的答案可能有用,stackoverflow.com/questions/6485496/…
  • 要解决这个问题,您可能可以创建一个简单的结构来包装 bool 值并将其存储在向量中
  • 或者只使用(比如)char的向量

标签: c++ gcc c++14


【解决方案1】:

从他的Effective STL一书中简要引用 Scott Meyers,第 18 项:“避免使用vector&lt;bool&gt;”。该专业化的语义意味着它不完全符合标准中的容器要求,因为它实际上并不存储布尔值;它使用位存储压缩表示。

每当您需要访问单个“bools”或需要指向数据序列的指针(如您的示例中)时,您就有麻烦了,因为没有办法获得指向单个位的指针.

正如上面@john 所提到的,vector&lt;uint8_t&gt; 可能会为您服务。或者,如果您重写函数以使用迭代器而不是指针,您可以尝试使用deque&lt;bool&gt;

【讨论】:

    【解决方案2】:

    不幸的是,vector&lt;bool&gt; 很特别。

    https://en.cppreference.com/w/cpp/container/vector_bool

    切换到vector&lt;uint8_t&gt; 可能会更好

    【讨论】:

    • std::vector&lt;std::bitset&lt;8&gt;&gt; 也可能是合适的替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2021-11-01
    • 2014-03-27
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多