"接受临时"警告

Rah*_*hul -2 c++

可能重复:
在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();
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 6

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

有什么问题vector<bool>?它工作正常vector<int>

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