-2

可能重复:
在访问 vector<bool> 中元素的地址时获取临时地址

我在以下代码的第 7 行收到“获取临时地址”警告

vector<bool> boolVect;
bool x = true;
boolVect.push_back(true);
boolVect.push_back(false);
ofstream fMetaOut("tmp.txt", ios::out);
fMetaOut.write((char* )&x, sizeof(bool));
fMetaOut.write((char* )&boolVect[0], sizeof(bool));
fMetaOut.close();

为什么我在第 7 行而不是在第 6 行收到此警告?两者都使用布尔地址。
我怎样才能摆脱这个警告?

4

2 回答 2

6

x不是临时的,它是一个左值,一个驻留在堆栈上的自动变量。
虽然,&boolVect[0]不是左值。
l-value 是一个可以获取地址的实体,简而言之,一个变量,其生命周期足够长,可以驻留在内存中,以便可以通过名称对其进行寻址。

有什么问题vector<bool>??它适用于vector<int>

C++ 标准库为布尔类型提供了专门的向量。目标是优化,使用比通常实现的类型更小的向量bool。通常的实现会为每个元素bool保留至少一个字节。专业化通常只在内部使用1一个元素的位,因此它通常小八倍。但是这种优化是有代价的: 在 C++ 中,最小的可寻址值的大小必须至少为字节。因此,向量的这种特殊化需要对引用和迭代器进行特殊处理。因此,a不能满足其他向量的所有要求。您看到的行为就是这样一个示例,其中的元素不是真正的左值。vector<bool>1
1vector<bool>vector<bool>

于 2012-05-10T05:13:33.877 回答
2

与 的其他特化不同vector,它不管理对象vector<bool>数组。bool相反,它管理一个打包的位域。

由于这些位不可单独寻址,boolVect[0]因此不是对 a 的引用bool;它是可转换为的类型的(临时)对象bool. 无法获得指向矢量元素的引用或指针。

如果您想要一个可以引用的布尔标志容器,那么vector<char>或者deque<bool>可能是合适的选择。

获取的地址x很好,因为它是一个(非临时)bool对象。

于 2012-05-10T05:23:50.970 回答