【问题标题】:vector<bool> raises an error on const data() methodvector<bool> 在 const data() 方法上引发错误
【发布时间】:2017-09-29 10:36:41
【问题描述】:

我有以下代码:

#include <vector>

struct TestStruct {
    std::vector<float> float_vect;
    std::vector<bool> bool_vect;
};

void func(const TestStruct & test)
{
    const float * p1 = test.float_vect.data();  //<---   this line works fine
    const bool * p2 = test.bool_vect.data();    //<---   on this line error happens
}

int main()
{
    TestStruct test;
    func(test);
}

错误信息:

将 'const std::vector' 作为 'void std::vector::data() [with _Alloc = std::allocator]' 的 'this' 参数传递会丢弃限定符 [-fpermissive]

std::vectordata() 方法指定了const

为什么这种方法在浮点向量上运行良好,而在布尔向量上引发错误?

【问题讨论】:

  • 我不认为标准规定有任何std::vector&lt;bool&gt;::data() 成员函数。
  • 我从来没有仔细观察过它,但是std::vector<bool>[...]std::vector&lt;bool&gt; is a possibly space-efficient specialization of std::vector for the type bool.[...][...]The manner in which std::vector&lt;bool&gt; is made space efficient (as well as whether it is optimized at all) is implementation defined.[...] 所以data() 的内存布局是未知的。
  • 我没有看到可用于std::vector&lt;bool&gt;data 方法。

标签: c++ vector


【解决方案1】:

vector&lt;bool&gt; 是旧的vector&lt;T&gt; 的特化,它的实现方式可能与普通的vector 不同(例如,可以采用一些节省空间的优化)。这种设计的副作用是它并不总是表现得像普通的vector(许多人认为vector&lt;bool&gt;因此而被破坏)。

例如,http://en.cppreference.com/w/cpp/container/vector_bool 的引用根本没有提到 vector&lt;bool&gt;::data()。因此 - 当使用 vector 类型为 bool 时,不应使用它。您没有收到类似于 method not found 的错误这一事实 - 在您的情况下 - 只是您的编译器如何实现 vector&lt;bool&gt; 的问题。

【讨论】:

    【解决方案2】:

    std::vector&lt;bool&gt; 是 STL 中 std::vector&lt;T&gt; 类的模板特化。为了使用更少的内存,布尔值以 8 为单位存储在一个字节中。这意味着没有您期望的直接数据可访问,因为该类不会以与其他类型相同的方式存储它。

    doc

    该特化具有与非特化向量相同的成员函数,除了 data、emplace 和 emplace_back,它们不存在于本特化中。

    【讨论】:

      猜你喜欢
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2017-03-06
      相关资源
      最近更新 更多