vector <bool>在const data()方法上引发错误

时间:2017-09-29 10:36:42

标签: c++ vector

我有以下代码:

#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]

data()的{​​{1}}方法指定了std::vector

为什么这个方法在float向量上工作正常,并在布尔向量上引发错误?

2 个答案:

答案 0 :(得分:3)

vector<bool>是一个好的旧vector<T>的特化,它的实现可能与普通的vector不同(例如,可以采用一些节省空间的优化)。这种设计的副作用是它并不总是像普通的vector那样(很多人认为vector<bool>因此而被打破)。

例如,http://en.cppreference.com/w/cpp/container/vector_bool处的引用根本没有提到vector<bool>::data()。因此 - 使用vector类型bool时,不应使用它。您没有收到与method not found类似的错误这一事实 - 在您的情况下 - 只是编译器实现vector<bool>的方式。

答案 1 :(得分:1)

std::vector<bool>是STL中类std::vector<T>的模板特化。为了使用更少的内存,布尔值以字节存储8。这意味着没有可以访问的直接数据,因为类不会以与其他类型相同的方式存储它。

查看doc

  

特殊化与非特殊化向量具有相同的成员函数,除了data,emplace和emplace_back,这些特殊化中不存在。